之前不知道为什么,用char[][]来标记搜过的地方:
#include<bits/stdc++.h>
using namespace std;
int cnt=1,n,m,xz[4]={0,0,1,-1},yz[4]={1,-1,0,0},vis[1010][1010];
bool s[1010][1010];
char ss[1010][1010];
map<char,int>mp;
int dfs(int a,int b){
vis[a][b]=cnt;
int ans=1;
ss[a][b]=char(cnt);
for(int i=0;i<4;i++){
if(vis[a+xz[i]][b+yz[i]]!=cnt&&s[a][b]^s[a+xz[i]][b+yz[i]]&&a+xz[i]<=n&&a+xz[i]>=1&&b+yz[i]<=n&&b+yz[i]>=1)
{
ans+=dfs(a+xz[i],b+yz[i]);
}
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%1d",&s[i][j]);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
if(mp[ss[x][y]]) printf("%d\n",mp[ss[x][y]]);
else printf("%d\n",mp[char(cnt)]=dfs(x,y));
cnt++;
}
return 0;
}
改成这样就A了:
#include<bits/stdc++.h>
using namespace std;
int cnt=1,n,m,xz[4]={0,0,1,-1},yz[4]={1,-1,0,0},vis[1010][1010],mp[100010];
bool s[1010][1010];
int dfs(int a,int b){
vis[a][b]=cnt;
int ans=1;
for(int i=0;i<4;i++){
if(vis[a+xz[i]][b+yz[i]]!=cnt&&s[a][b]^s[a+xz[i]][b+yz[i]]&&a+xz[i]<=n&&a+xz[i]>=1&&b+yz[i]<=n&&b+yz[i]>=1)
{
ans+=dfs(a+xz[i],b+yz[i]);
}
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%1d",&s[i][j]);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
if(mp[vis[x][y]]) printf("%d\n",mp[vis[x][y]]);
else printf("%d\n",mp[cnt]=dfs(x,y));
cnt++;
}
return 0;
}