这是一道非常典型的BFS题

我说实话,这道题和 填涂颜色 差不多

都是输入0011

所以直接暴搜是最好的

上代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
char g[1001][1001];//用char
int det[4][2]={{1,0},{-1,0},{0,-1},{0,1}};//方向
struct Point//个人喜欢用Point
{
	int x,y;
};
Point q[1000101],s;//Point
int res[1001][1001];
bool used[1001][1001];
int ans;
void bfs(Point cur)//bfs(Point)
{
	//memset(used,0,sizeof(used));
	int f=1,e=0;//f必须为1,e必须为0
	used[cur.x][cur.y]=1;
	q[++e]=cur;
	while(f<=e)//满足条件,开始搜索
	{
		Point u=q[f++];//Point
		for(int i=0;i<4;i++)
		{
			Point v;//Point
			v.x=u.x+det[i][0],v.y=u.y+det[i][1];
			if(v.x<0||v.x>=n) continue;//过边界,跳过
			if(v.y<0||v.y>=n) continue;//过边界,跳过
			if(used[v.x][v.y]==1) continue;//重复,跳过
			if(g[u.x][u.y]==g[v.x][v.y]) continue;//同一个点,跳过
			used[v.x][v.y]=1;//第一个点
			ans++;//ans+1
			q[++e]=v;//继续搜索
		}
	}
	for(int i=1;i<=e;i++)
		res[q[i].x][q[i].y]=ans;
}
int main()
{
	memset(res,-1,sizeof(res));//清空res
	cin>>n>>m;
	for(int i=0;i<n;i++)
		scanf("%s",g[i]);//scanf省时间
	for(int _m=1;_m<=m;_m++)//已经使用过m,设置个_m作为变量
	{
		scanf("%d %d",&s.x,&s.y);//scanf省时间
		s.x--,s.y--;
		if(res[s.x][s.y]==-1)//网格为1
		{
			ans=1;//答案为1
			bfs(s);//开始搜索
		}
		//cout<<res[s.x][s.y]<<endl;
		printf("%d\n",res[s.x][s.y]);//printf省时间
	}
	return 0;
}

代码100%AC

其中有很多优化,比如scanf,printf,自己理解