https://www.luogu.org/problem/P1141
#include<bits/stdc++.h>//最喜欢的万能头 using namespace std; int n,m; char a[1005][1005];//注意一定要开char,否则会炸,后果自负 int b[1005][1005];//记录有没有走过 int i,j,ans[100005];//记录答案 int x,y;//提供的下标 int mx[4]={0,0,1,-1};//四个方向寻找 int my[4]={1,-1,0,0}; void dfs(int x,int y,int p,int i){ if(x<0||x>=n||y<0||y>=n||b[x][y]!=-1||a[x][y]-48!=p)//如果不在范围内,或是找过或是数字不正确 return; b[x][y]=i;//这一步很关键,下面叙述 ans[i]++;//加一个点 for(int k=0;k<4;k++){ int kx=x+mx[k]; int ky=y+my[k]; dfs(kx,ky,!p,i);//dfs常用套路, !p是为了变换数字 } } int main(){ cin>>n>>m; for(i=0;i<n;i++) scanf("%s",&a[i]); memset(b,-1,sizeof(b));//清空 for(i=0;i<m;i++){ cin>>x>>y;//输入 x--,y--;//因为数组从0开始读,给的下标从1开始 if(b[x][y]==-1) dfs(x,y,a[x][y]-48,i);//符合条件就dfs else ans[i]=ans[b[x][y]];//最关键的一步!!如果已经走过,意味着本轮搜索结束,答案就是上一步的i,也就是b数组存在的第二意义。(承接上文b[x][y]=i;) } for(i=0;i<m;i++) cout<<ans[i]<<endl;//完美输出 return 0; } /*因为ASC码48就是‘0‘,也就是说‘0‘的值是48,而后依次是‘1‘到‘9‘ 如果不减去,会超出n, 这样正好是char型减去48就是它对应的int值 */
原文:https://www.cnblogs.com/QingyuYYYYY/p/11651427.html