【題解】洛谷P1162填塗顏色 bfs
阿新 • • 發佈:2018-12-16
從邊界bfs,標記所有圈外的0,最後找未標記的0
#include<cstdio> #include<queue> using namespace std; int n,a[35][35],vis[35][35]; int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; struct node{ int x,y; node(){} node(int _x,int _y):x(_x),y(_y){} }; inline void bfs(int x,int y) { queue<node>q;while(q.size())q.pop(); vis[x][y]=1;q.push(node(x,y)); while(q.size()) { node tmp=q.front();q.pop(); for(int i=0;i<4;i++) { int nx=tmp.x+dx[i]; int ny=tmp.y+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&!vis[nx][ny]&&a[nx][ny]!=1) { vis[nx][ny]=1;q.push(node(nx,ny)); } } } } int main() { //freopen("in.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) { if(a[1][i]==0&&!vis[1][i])bfs(1,i); if(a[n][i]==0&&!vis[n][i])bfs(n,i); if(a[i][1]==0&&!vis[i][1])bfs(i,1); if(a[i][n]==0&&!vis[i][n])bfs(i,n); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]==0&&!vis[i][j]) printf("2%c",j==n?'\n':' '); else printf("%d%c",a[i][j],j==n?'\n':' '); return 0; }
總結
無