洛谷P1162 填涂颜色
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1162 填涂颜色
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:https://www.luogu.org/problemnew/show/P1162
這道題是LITTLESUN寫的第一道BFS哦!
對于這道題的的思路是把封閉圖形外邊的0標記一邊,在最后輸出的時候把沒有標記過的0輸出為2,其他按照原圖輸出。
對于這道題的的邊界有兩種判斷方式。第一種是在原圖外面加一圈0
AC代碼如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define MAXN 2000 using namespace std; int G[MAXN][MAXN]; bool vis[MAXN][MAXN]; struct item {int x;int y; }; int n; item a; item t2; void bfs() {queue<item>q;a.x=1;a.y=1;q.push(a);while(!q.empty()){item t=q.front();q.pop();if(G[t.x+1][t.y]==0&&t.x!=n+2&&!vis[t.x+1][t.y]){vis[t.x+1][t.y]=1;t2.x=t.x+1;t2.y=t.y;q.push(t2);}if(G[t.x-1][t.y]==0&&t.x!=1&&!vis[t.x-1][t.y]){vis[t.x-1][t.y]=1;t2.x=t.x-1;t2.y=t.y;q.push(t2);}if(G[t.x][t.y+1]==0&&t.y!=n+2&&!vis[t.x][t.y+1]){vis[t.x][t.y+1]=1;t2.x=t.x;t2.y=t.y+1;q.push(t2);} if(G[t.x][t.y-1]==0&&t.y!=1&&!vis[t.x][t.y-1]){vis[t.x][t.y-1]=1;t2.x=t.x;t2.y=t.y-1;q.push(t2);}}}int main() {scanf("%d",&n);for(int i=2;i<=n+1;i++){for(int j=2;j<=n+1;j++){scanf("%d",&G[i][j]);}}bfs();for(int i=2;i<=n+1;i++){for(int j=2;j<=n+1;j++){if(!vis[i][j]&&G[i][j]==0){G[i][j]=2;}}}for(int i=2;i<=n+1;i++){//cout<<endl;for(int j=2;j<=n+1;j++){printf("%d ",G[i][j]);}cout<<endl;}return 0; }另一種方法是枚舉邊界每一個不是一的點作為起點進行BFS
但這個代碼不知道哪里鍋掉了,只有80分qwq
代碼如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define MAXN 2000 using namespace std; int G[MAXN][MAXN]; bool vis[MAXN][MAXN]; struct item {int x;int y; }; int n; item a; queue<item> q; void bfs(item b) {q.push(b);while(!q.empty()){item t=q.front();q.pop();if(G[t.x+1][t.y]==0&&t.x!=n&&!vis[t.x+1][t.y]){vis[t.x+1][t.y]=1;t.x=t.x+1;t.y=t.y;q.push(t);}if(G[t.x-1][t.y]==0&&t.x!=1&&!vis[t.x-1][t.y]){vis[t.x-1][t.y]=1;t.x=t.x-1;t.y=t.y;q.push(t);}if(G[t.x][t.y+1]==0&&t.y!=n&&!vis[t.x][t.y+1]){vis[t.x][t.y+1]=1;t.x=t.x;t.y=t.y+1;q.push(t);} if(G[t.x][t.y-1]==0&&t.y!=1&&!vis[t.x][t.y-1]){vis[t.x][t.y-1]=1;t.x=t.x;t.y=t.y-1;q.push(t);}} } void work(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if((i==1||i==n||j==1||j==n)&&G[i][j]!=1){a.x=i;a.y=j; bfs(a);}}} } int main() {scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&G[i][j]);}}work();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!vis[i][j]&&G[i][j]==0){G[i][j]=2;}}}for(int i=1;i<=n;i++){//cout<<endl;for(int j=1;j<=n;j++){printf("%d ",G[i][j]);}cout<<endl;}return 0; }?
轉載于:https://www.cnblogs.com/LITTLESUNwl/p/10516634.html
總結
以上是生活随笔為你收集整理的洛谷P1162 填涂颜色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云数据管理公“云信达”获东方富海数千万A
- 下一篇: 中小型互联网企业安全建设漫谈。