you131 @ 2024-07-11 21:04:18
//思路:
//bfs
//遍历一次+1
//重点:连通的最后的值都是一样的,所以vis不需要重置
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
int f[N][N]; //表示迷宫
int vis[N][N]; //访问标记
int x[4]={-1,0,1,0}; //上右下左
int y[4]={0,1,0,-1};
int ans[N][N]; //记录结果
int c=0; //使用bfs的次数
void bfs(int a,int b){ //a和b表示开始节点,返回访问节点数
queue<pair<int,int> > q;
int res=1;
c++;
// memset(vis,0,sizeof(vis));
q.push(make_pair(a,b));
vis[a][b]=c;
while(!q.empty()){
pair<int,int> t=q.front(); //取栈顶元素
q.pop();
for(int i=0;i<4;i++){
int a1=t.first+x[i];
int b1=t.second+y[i];
if(!vis[a1][b1]&&a1>0&&a1<=n&&b1>0&&b1<=n){
if(f[a1][b1]!=f[t.first][t.second]){
vis[a1][b1]=c;
res++;
q.push(make_pair(a1,b1));
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==c)
ans[i][j]=res;
}
}
}
int main(void){
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=0;j<s.size();j++)
f[i][j+1]=s[j]-'0';
}
int res=0;
for(int i=1;i<=m;i++){
if(i!=1) cout<<endl;
int a,b;
cin>>a>>b;
if(ans[a][b]==0)
bfs(a,b);
cout<<ans[a][b];
}
return 0;
}
by you131 @ 2024-07-11 21:06:05
主要问题是超时,有两个样例通不过