由數字0組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的全部空間都填寫成2.例如: 6×6的方陣(n=6),塗色前和塗色後的方陣以下: c++
0 0 0 0 0 0 數組 0 0 1 1 1 1 測試 0 1 1 0 0 1 spa 1 1 0 0 0 1 blog 1 0 0 0 0 1 ci 1 1 1 1 1 1 it |
0 0 0 0 0 0 入門 0 0 1 1 1 1 table 0 1 1 2 2 1 class 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1 |
1≤n≤30
思路:
這道是一道入門的搜索題。主要是區分'1'的邊界之內的東西(也就是說染色,染成'2').(深搜/廣搜)
在圖上搜索一點會有固定的走法,必定的狀態。就舉一個栗子(設當前狀態爲i,j),那麼i-1,j等就能夠了。
dfs(p-1,q);
dfs(p+1,q);
dfs(p,q-1);
dfs(p,q+1);
加上越界就沒問題了。
if (p<0||p>n+1||q<0||q>n+1||a[p][q]) return;
再判斷數組狀態輸出便可。
for (i=1; i<=n; i++)
for (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 (i=1; i<=n; i++) {
for (j=1; j<=n; j++)
if (a[i][j]==0) cout<<2<<' ';
else cout<<b[i][j]<<' ';
cout<<'\n';
}
參考深搜代碼:
#include <bits/stdc++.h>//萬能頭
using namespace std;
int a[32][32],b[32][32];
int n,i,j;
void dfs(int p,int q) {
int i;
if (p<0||p>n+1||q<0||q>n+1||a[p][q]) return;//邊界
a[p][q]=1;
dfs(p-1,q);//狀態
dfs(p+1,q);
dfs(p,q-1);
dfs(p,q+1);
}
int main() {
cin>>n;
for (i=1; i<=n; i++)
for (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 (i=1; i<=n; i++) {
for (j=1; j<=n; j++)
if (a[i][j]==0) cout<<2<<' ';//判斷
else cout<<b[i][j]<<' ';
cout<<'\n';
}
return 0;//好習慣
}
OVER!
——2019.04.07