洛谷 01迷宫(P1141)的两种解法 -- dfs 和 bfs

题目描述:
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入格式 第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第iii行第jjj列的一个格子,询问从这一格开始能移动到多少格。
输出格式 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\n",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\n" , ans[i]);
     }
   return 0;
}

你可能感兴趣的:(c++,dfs,bfs)