https://www.luogu.org/problem/show?pid=1141
还不太会用 BFS
然后就跟着感觉走了一波
经历了很多错误 刚开始的读入 然后BFS的过程
最后T三个点
看到别人的题解思路 后 自己改了一次
用dp[i][j] 记录 i ,j是在哪个联通快里面的
然后 ans[cnt] 记录 第cnt个联通块的结果
//bfs + 记忆话搜索 #include<bits/stdc++.h> using namespace std; typedef pair<int,int> pii; int n,m; char mp[1010][1010]; int dp[1010][1010]; //记录每个点的情况的父亲节点 bool vis[1010][1010]; int fx[]={-1,0,0,1}; int fy[]={0,-1,1,0}; int ans[1000*1000 +100];//存储结果 int cnt = 1; bool check(int x,int y,char k) { if(vis[x][y]==0 && mp[x][y] == k && x>=1 && x<=n && y<=n && y>=1 ) { return 1; } return 0; } int bfs(int x,int y) { int sum = 0; queue<pii> que; que.push({x,y}); //cout<< "yes1 "<<endl; //vis[x][y] = 1; while (que.size()) { pii now = que.front(); que.pop(); //cout<< "yes2 "<<endl; if(vis[now.first][now.second] ) continue; sum++; vis[now.first][now.second] = 1; dp[now.first][now.second] = cnt; char k = (mp[now.first][now.second] == ‘1‘)?‘0‘:‘1‘; for(int i=0;i<4;i++) { //cout<< "yes3 "<<endl; int dx = now.first +fx[i]; int dy = now.second + fy[i]; //cout << dx <<" "<<dy<<endl; if(check(dx,dy,k)) { //sum++; //cout<< "yes4 "<<endl; que.push({dx,dy}); } //vis[dx][dy] = 1; } } //cout<<sum<<endl; ans[cnt++] = sum; return sum; } int main () { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf(" %c", &mp[i][j]); while (m--) { //memset(vis,0,sizeof(vis)); int x,y; scanf("%d %d",&x,&y); if( dp[x][y] ) { cout<< ans[ dp[x][y] ]<<endl; continue; } cout<< bfs(x,y)<<endl; } }
时间: 2024-10-10 08:53:02