4 条题解
-
1
set,vector都可以 暂时存走了哪些点都可以都可 然后把走过的点赋值上ans if(jz[x][y]==0)判断走没走过优化避免重复计算值 其他的就是vector用法
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,ans; char a[1005][1005]; bool pd[1005][1005]; ll jz[1005][1005]; vector<pair<ll,ll>>b; void dfs(int x,int y,char syg) { if(jz[x][y]!=0||pd[x][y]==true|| x<1||x>n|| y<1||y>n|| syg==a[x][y]) return; pd[x][y]=true; ans++; b.push_back(make_pair(x,y)); dfs(x+1,y,a[x][y]); dfs(x-1,y,a[x][y]); dfs(x,y+1,a[x][y]); dfs(x,y-1,a[x][y]); return; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m;; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; while(m--) { ll x,y; cin>>x>>y; if(jz[x][y]==0) { dfs(x,y,'a'); for (auto&i:b) jz[i.first][i.second]=ans; b.clear(); ans=0; } printf("%lld\n",jz[x][y]); } return 0; } -
0
洪水填充板子题:bfs+区域标记
int dx[4] = { 0,0,-1,1 }; int dy[4] = { 1,-1,0,0 }; void solveA() { int t = 1; et(t) { int n, m; cin >> n >> m; vector<vector<int>>matrix(n + 1, vector<int>(n + 1)); for (int i = 1; i <= n; i++) { string str; cin >> str; for (int j = 1; j <= n; j++) { matrix[i][j] = str[j - 1] + '0'; } } int cnt = 1; unordered_map<int, int>hash; vector<vector<int>>mask(n + 1, vector<int>(n + 1,0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (mask[i][j] == 0) { queue<pair<int,int>>q; int num = 1; q.push({ i,j }); mask[i][j] = cnt; while (!q.empty()) { int top_i = q.front().first; int top_j = q.front().second; q.pop(); for (int dic = 0; dic < 4; dic++) { int ni = top_i + dy[dic]; int nj = top_j + dx[dic]; if (ni >= 1 && ni <= n && nj >= 1 && nj <= n&&mask[ni][nj]==0) { if (matrix[top_i][top_j] != matrix[ni][nj]) { q.push({ ni,nj }); mask[ni][nj] = cnt; num++; } } } } hash[cnt] = num; cnt++; } } } for (int i = 0; i < m; i++) { int ni, nj; cin >> ni >> nj; cout << hash[mask[ni][nj]] << endl; } } } -
0
BFS
ll n,m; const ll Max1=1005; char t[Max1][Max1]; ll pd[Max1][Max1]; ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; void bfs(ll x,ll y) { ll ans=1; vector<pair<ll,ll>>jyh; queue<pair<ll,ll>>dl; dl.push(make_pair(x,y)); jyh.push_back(make_pair(x,y)); pd[x][y]=1; while(!(dl.empty())) { ll x1,y1; x1=dl.front().first,y1=dl.front().second; dl.pop(); for(int i=0;i<4;i++) { if(((x1+dx[i]>=1&&x1+dx[i]<=n)&&(y1+dy[i]>=1&&y1+dy[i]<=n))&&t[x1][y1]!=t[x1+dx[i]][y1+dy[i]]&&pd[x1+dx[i]][y1+dy[i]]==0) { ans++; dl.push(make_pair(x1+dx[i],y1+dy[i])); jyh.push_back(make_pair(x1+dx[i],y1+dy[i])); pd[x1+dx[i]][y1+dy[i]]=1; } } } for(auto i:jyh) pd[i.first][i.second]=ans; return ; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) cin>>t[i][j]; while(m--) { ll x,y; cin>>x>>y; if(pd[x][y]==0) bfs(x,y); cout<<pd[x][y]<<'\n'; } return 0; } -
-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+并查集优化((())))
- 1
信息
- ID
- 1095
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 93
- 已通过
- 8
- 上传者
比并查集快,还见简单
orz