https://www.luogu.com.cn/problem/P1141?contestId=67264https://www.luogu.com.cn/problem/P1141?contestId=67264思路:这个题最开始用简单BFS模板写的,然后直接TLE。因为如果每个数据都要搜索一遍的话就太浪费时间了,然后就涉及到了连通块。彼此能够到达的点就是一个连通块,因为他们之间能够彼此到达,所以他们能够到达的点都是一样的,然后再存起来。
AC代码
#include<iostream>
#include<queue>
using namespace std;
int g[1010][1010],bk[1010][1010],ans[1000010];
int n,m,sum=0,t=1;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
struct date
{
int x,y;
}pp;
queue<date> q;
void bfs()
{
while(!q.empty())
{
date now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int tx=now.x+dx[i];
int ty=now.y+dy[i];
if(g[tx][ty]!=g[now.x][now.y]&&tx>=1&&ty>=1&&tx<=n&&ty<=n&&bk[tx][ty]==0)
{
sum++;
bk[tx][ty]=t;
q.push({tx,ty});
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
char x;cin>>x;
g[i][j]=x-'0';
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(bk[i][j]==0)
{
sum=1;
bk[i][j]=t;
q.push({i,j});
bfs();
ans[t]=sum;
t++;
}
while(m--)
{
int x,y;
cin>>x>>y;
cout<<ans[bk[x][y]]<<endl;
}
return 0;
}
TEL的简单bfs代码
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct date
{
int x,y;
}pp;
int n,m,ans=0;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int g[1010][1010],bk[1010][1010];
void bfs(int x,int y)
{
queue<date> q;
memset(bk,0,sizeof bk);
pp.x=x,pp.y=y;
q.push(pp);
while(!q.empty())
{
date now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
pp.x=now.x+dx[i];
pp.y=now.y+dy[i];
if(g[now.x][now.y]==0)
{
if(g[pp.x][pp.y]==1&&pp.x>=1&&pp.x<=n&&pp.y>=1&&pp.y<=n&&bk[pp.x][pp.y]==0)
{
bk[pp.x][pp.y]=1;
q.push(pp);
ans++;
}
}
if(g[now.x][now.y]==1)
{
if(g[pp.x][pp.y]==0&&pp.x>=1&&pp.x<=n&&pp.y>=1&&pp.y<=n&&bk[pp.x][pp.y]==0)
{
bk[pp.x][pp.y]=1;
q.push(pp);
ans++;
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
char x;cin>>x;
g[i][j]=x-'0';
}
while(m--)
{
int x,y;ans=0;
cin>>x>>y;
bfs(x,y);
cout<<ans<<endl;
}
return 0;
}