洛谷01迷宮(P 141)の2つの解法--dfsとbfs

25150 ワード

数字の0と1だけからなるnがあります×n格迷宮.グリッド0に位置すると、隣接する4つのグリッドの1つに移動できます.同じように、グリッド1に位置すると、隣接する4つのグリッドの0に移動できます.あなたの任務は、与えられた迷路について、あるグリッドからどれだけの格子(自分を含む)に移動できるかを尋ねることです.フォーマット第1の動作の2つの正の整数n,mを入力します.次のn行、各行n文字、文字は0または1のみで、文字間にスペースはありません.次にm行、各行2個をスペースで区切った正の整数i,jは、迷宮のiii行目jj列目の格子に対応し、この格子からどれだけの格子に移動できるかを尋ねる.出力フォーマットm行は、質問ごとに対応する答えを出力します.タイトルリンクの下にはコードがあります.
/* dfs +       */
#include
using namespace std;
char maze[1010][1010];  //    
int book[1010][1010] , n , m , walk[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};  //book      
int ans[100001];//    
void dfs(int x , int y , int num)   //x,y     ,num      
{
   for(int i = 0 ; i < 4 ; i++){
    int dx = x + walk[i][0];
    int dy = y + walk[i][1];
      if(book[dx][dy] == 0)
      if(maze[x-1][y-1] != maze[dx-1][dy-1] && dx > 0 && dy > 0 && dx <= n && dy <= n){
         book[dx][dy] = num;   //         ,         ,          
         ans[num]++;        //      
         dfs(dx , dy , num);
     }
   }
}
int main()
{
   //freopen("P1141_2.in","r",stdin);
   int x , y;
   cin>>n>>m;
   for(int i = 0 ; i < n ; i++)
       scanf("%s",&maze[i]);
    for(int i = 1 ; i <= m ; i++){
        scanf("%d%d",&x,&y);
        if(book[x][y] == 0)dfs( x , y , i );  //         ,   dfs
        else ans[i] = ans[book[x][y]];       //      ,        
        printf("%d
"
,ans[i]); } return 0; } /* bfs + */ #include using namespace std; char Map[1001][1001]; // int book[1001][1001] , ans[100001] , n , m , xi , yi , walk[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; // book dfs book struct node{ // int x , y; }; queue<node>q;node nd; // void bfs(int x , int y , int num) //num { nd.x = x; nd.y = y; ans[num]++; book[x][y] = num; q.push(nd); // while(!q.empty()){ // nd = q.front(); // for(int i = 0 ; i < 4 ; i++){ // node nnode = nd; nnode.x = nd.x + walk[i][0]; nnode.y = nd.y + walk[i][1]; if(book[nnode.x][nnode.y] == 0 && nnode.x > 0 && nnode.y > 0 && nnode.x <= n && nnode.y <= n && Map[nd.x-1][nd.y-1] != Map[nnode.x-1][nnode.y-1]){ // q.push(nnode); // ans[num]++; // n book[nnode.x][nnode.y] = num; // } } q.pop(); // } } int main() { cin>>n>>m; for(int i = 0 ; i < n ; i++) scanf("%s",&Map[i]); for(int i = 1 ; i <= m ; i++){ scanf("%d%d",&xi,&yi); if(book[xi][yi] == 0){ bfs(xi , yi , i); } else ans[i] = ans[book[xi][yi]]; printf("%d
"
, ans[i]); } return 0; }