P1162 填塗顏色
阿新 • • 發佈:2020-09-19
我的思路(還是想了些許時間的):
按照題目的閉合圈的規定:
- 閉合圈由數字1構成
- 圍圈時只走上下左右4個方向
- 方陣內只有一個閉合圈,圈內至少有一個0
可知從上到下, 從左到右遍歷到第一個為1的格子的右下角必定為圈內的0,然後就是bfs填充連通塊了
const int N=35; int g[N][N]; PII st; int n; inline bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<n; } void bfs(int x,int y) { queue<PII> q; q.push({x,y}); g[x][y]=2; while(q.size()) { PII t=q.front(); q.pop(); for(int i=0;i<4;i++) { int a=t.fi+dx[i],b=t.se+dy[i]; if(check(a,b) && !g[a][b]) { g[a][b]=2; q.push({a,b}); } } } } int main() { cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>g[i][j]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(g[i][j] == 1) { st.fi=i,st.se=j; goto bfs; } bfs: bfs(st.fi+1,st.se+1); for(int i=0;i<n;i++,cout<<endl) for(int j=0;j<n;j++) cout<<g[i][j]<<' '; //system("pause"); }
大部分題解做法:
在外面圍一圈0
const int N=35; int g[N][N]; bool vis[N][N]; PII st; int n; inline bool check(int x,int y) { return x>=0 && x<=n+1 && y>=0 && y<=n+1; } void bfs(int x,int y) { queue<PII> q; q.push({x,y}); vis[x][y]=true; while(q.size()) { PII t=q.front(); q.pop(); for(int i=0;i<4;i++) { int a=t.fi+dx[i],b=t.se+dy[i]; if(check(a,b) && !g[a][b] && !vis[a][b]) { vis[a][b]=true; q.push({a,b}); } } } } int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>g[i][j]; bfs(0,0); for(int i=1;i<=n;i++,cout<<endl) for(int j=1;j<=n;j++) if(!g[i][j] && !vis[i][j]) cout<<2<<' '; else cout<<g[i][j]<<' '; //system("pause"); }