洛谷 P1141 01迷宫
题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
分析
广搜加并查集,洪水填充某格能走的地方并将他们标记上数量,下一次判断若坐标处有数量直接输出可避免超时
(从1-14做到2-12终于做出来了!!!!)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1001][1001],b[1001][1001];
int s[1000001][2];
int dx[5];
int dy[5];
int n,m;
void init()
{
int i,j;
string k;
cin>>n>>m;
for (i=1;i<=n;i++)
{
cin>>k;
for (j=0;j<=n;j++)
a[i][j+1]=k[j]-48;
}
dx[1]=1;dx[2]=-1;dx[3]=0;dx[4]=0;
dy[1]=0;dy[2]=0;dy[3]=1;dy[4]=-1;
return;
}
void bfs(int x,int y)
{
int h,t,i,j;
t=1;h=0;s[1][0]=x;s[1][1]=y;b[x][y]=-1;
do
{
h++;
for (i=1;i<=4;i++)
if (s[h][0]+dx[i]>=1&&s[h][0]+dx[i]<=n&&s[h][1]+dy[i]>=1&&s[h][1]+dy[i]<=n)
if (a[s[h][0]+dx[i]][s[h][1]+dy[i]]!=a[s[h][0]][s[h][1]]&&b[s[h][0]+dx[i]][s[h][1]+dy[i]]==0)
{
t++;
s[t][0]=s[h][0]+dx[i];
s[t][1]=s[h][1]+dy[i];
b[s[t][0]][s[t][1]]=-1;
}
}
while (h<=t);
for (i=0;i<=h-1;i++) b[s[i][0]][s[i][1]]=h-1;
return;
}
void doit()
{
int i,x,y;
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if (b[x][y]==0) bfs(x,y);
printf("%d\n",b[x][y]);
}
return;
}
int main()
{
init();
doit();
return(0);
}