2 条题解
- 
  -1
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1010; int n,m,ans,sum[1010100]; char mp[N][N]; bool vis[N][N]; int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0}; int f[1010100]; int find(int p) { if(p!=f[p]) f[p] = find(f[p]); return f[p]; } void dfs(int x,int y) { if(ans == n*n) return; for(int i=0;i<4;i++) { int tx = x+dx[i],ty = y+dy[i]; if(tx<=0||tx>n||ty<=0||ty>n) continue; if(vis[tx][ty]) continue; if(mp[tx][ty] == mp[x][y]) continue; vis[tx][ty] = 1; f[(tx-1)*n+ty] = find((x-1)*n+y); ans ++; dfs(tx,ty); } return; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>m; for(int i = 1;i<=n;i++) { string s; cin>>s; for(int j = 0;j<n;j++) { mp[i][j+1] = s[j]; } } for(int i = 1;i<=n;i++) { for(int j = 1;j<=n;j++) { int idx = (i-1)*n+j; f[idx] = idx; } } for(int i = 1;i<=m;i++) { int x,y; ans = 1; cin>>x>>y; if(sum[find((x-1)*n+y)]) cout<<sum[find((x-1)*n+y)]<<endl; else { vis[x][y] = 1; ans = 1; dfs(x,y); sum[(x-1)*n+y] = ans; cout<<ans<<endl; } } return 0; }dfs+并查集优化((())))
 
信息
- ID
 - 1095
 - 时间
 - 1000ms
 - 内存
 - 256MiB
 - 难度
 - 9
 - 标签
 - 递交数
 - 69
 - 已通过
 - 6
 - 上传者