为什么这样改就对了
查看原帖
为什么这样改就对了
605945
luo_xiaoran楼主2023/5/24 13:12

之前不知道为什么,用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;
}
2023/5/24 13:12
加载中...