这是一道非常典型的BFS题
我说实话,这道题和 填涂颜色 差不多
都是输入和
所以直接暴搜是最好的
上代码:
#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,自己理解