题目描述:
有一个仅由数字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;
}