题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:
输入的第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出格式:
输出包括m行,对于每个询问输出相应答案。
输入输出样例
输入样例#1:
2 2
01
10
1 1
2 2
输出样例#1:
4
4
说明
所有格子互相可达。
对于20%的数据,n≤10;
对于40%的数据,n≤50;
对于50%的数据,m≤5;
对于60%的数据,n≤100,m≤100;
对于100%的数据,n≤1000,m≤100000
一开始思路是并查集,所以就去写了一个。
用了一堆sb的方法生生把二维转成一维,然而没用,一节晚自习……
看了题解,其实只要记录根节点就好了,不用并查集那一套,而且并查集合并时我写炸了,于是历时两节晚自习……傻了傻了
1 int main() 2 { 3 memset(ans,-1,sizeof(ans)); 4 memset(genx,0,sizeof(genx)); 5 memset(geny,0,sizeof(geny)); 6 scanf ("%d %d",&n,&m); 7 for (int i=1;i<=n;i++) 8 { 9 char str[1001]; 10 scanf (" %s",str); 11 for (int j=1;j<=n;j++) 12 { 13 s[i][j]=str[j-1]-‘0‘; 14 } 15 } 16 for (int i=1;i<=m;i++) 17 { 18 int b,c; 19 tot=0; 20 scanf ("%d %d",&b,&c); 21 if (ans[genx[b][c]][geny[b][c]]>0) 22 { 23 printf("%d\n",ans[genx[b][c]][geny[b][c]]); 24 continue; 25 } 26 curx=b; 27 cury=c; 28 f(b,c); 29 printf("%d\n",tot); 30 ans[b][c]=tot; 31 genx[b][c]=b; 32 geny[b][c]=c; 33 } 34 // w(); 35 return 0; 36 }
耗时/内存
212ms, 24121KB