塗色(題解)

題目描述

由數字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 

 

輸入

每組測試數據第一行一個整數n(1≤n≤30) 

接下來n行,由0和1組成的n×n的方陣。 

方陣內只有一個閉合圈,圈內至少有一個0。 

輸出

已經填好數字2的完整方陣。 

樣例輸入

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

提示

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

相關文章
相關標籤/搜索