洛谷P1162—填塗顏色
這應該是是第一次記錄洛谷題庫裡的題目吧;
題目描述
由數字00組成的方陣中,有一任意形狀閉合圈,閉合圈由數字11構成,圍圈時只走上下左右44個方向。現要求把閉合圈內的所有空間都填寫成22.例如:6 \times 66×6的方陣(n=6n=6),塗色前和塗色後的方陣如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
輸入格式
每組測試資料第一行一個整數n(1 \le n \le 30)n(1≤n≤30)
接下來nn行,由00和11組成的n \times nn×n的方陣。
方陣內只有一個閉合圈,圈內至少有一個00。
//感謝黃小U飲品指出本題資料和資料格式不一樣. 已修改(輸入格式)
輸出格式
已經填好數字22的完整方陣。
輸入輸出樣例
輸入 #16 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1輸出 #1
0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1
說明/提示
1≤n≤30
關於思路,放在題解下面了
題解
#include<bits/stdc++.h> using namespace std;int a[35][35]; int b[35][35]; int c; int dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0}; int n,z,m; void dfs(int hh,int ha) { if(hh<0||hh>n+1||ha<0||ha>n+1||a[hh][ha]) return; a[hh][ha]=1; for(int i=0;i<4;i++) dfs(hh+dx[i],ha+dy[i]); } int main() { cin>>n; for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) { cin>> b[i][j]; if(b[i][j]==0) a[i][j]=0; else a[i][j]=2; } } dfs(0,0); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==0) cout<<2<<" "; else cout<<b[i][j]<<" "; } cout<<endl; } return 0; }
思路:
這道題還是要用DFS做
關於DFS的函式怎麼寫我就不多說了
關於主函式的內容,是這樣的:
首先明確二維陣列a和b分別代表什麼:a代表的是方陣不同的地帶的表示(牆體是2,牆外是1,牆內是0,這個待會就會提及了),b代表這個矩形方陣,而為了方便,我們把圖中輸入的“1”視為牆(不是說牆的表示是1,他是2),而我們的主要目的就是把在牆內和牆外的區別對待
輸入二維陣列b的時候,我們把牆表示為2,即a[i][j]=2,其餘的空地我們把它看做0,即if(b[i][j]==0) a[i][j]=0,
接著就是dfs了,我們一個一個點的去遍歷,當遇到牆的時候,就沒法走,就只能從其他三個方向繞過這隔牆,所以牆內的畫是永遠然不到顏色的,即 if(撞到邊界||已經遍歷過) return ; 接著, a[i][j]=1;
那麼我們就分離出了:牆內的是0;牆體是2;牆外的是1;
最後一步我們進行判斷,if(a[i][j]==0) 給他染上色,即cout<<2,else (即牆體和牆外的)cout<<b[i][j](他們原來是啥現在就是啥)
然後就OK啦!
2022.3.6