1. 程式人生 > >洛谷P1162 填塗顏色

洛谷P1162 填塗顏色

說明 range ron pac cin tex c++ continue int

題目描述

由數字0組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2.例如:6×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<=n<=30

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

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

//感謝黃小U飲品指出本題數據和數據格式不一樣. 已修改(輸入格式)

輸出格式:

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

輸入輸出樣例

輸入樣例#1:
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
輸出樣例#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

解題思路:

題目讓我們將被包圍的0換成2,那麽我們不妨將問題轉化,,將所有0初始化為2,將不被包圍的2換成0,轉化完後便十分輕易地有了解題思路,由題知,在邊界上的2一定不被1包圍,那麽我們用深搜求一下所有與邊界上的2相連的2,更新為0,便可以求出答案.

AC代碼:

 1 #include<bits/stdc++.h>  
 2 using namespace std;
 3 int n,a[35][35];
 4 bool vis[35][35];
 5 void dfs(int x,int y){//將2變成0的過程 
 6     if(x >= 0 && x <= n + 1 && y >= 0 && y <= n + 1){//判斷是否越界 
 7          if(a[x][y] == 1 || a[x][y] == 0) return ;//如果是1或已經被更新過了,就跳過 
8 else{ 9 a[x][y] = 0;//更新 10 dfs(x + 1, y); dfs(x - 1, y);//上下左右四個方向遍歷 11 dfs(x, y + 1); dfs(x, y - 1); 12 } 13 } 14 } 15 int main() 16 { 17 cin >> n; 18 for(int i = 0;i <= n+1; i++) 19 for(int x = 0;x <= n+1; x++) { 20 if(i == 0 || x == 0) {//邊界特判,如果不判,就無法一次性求出所有與邊界相連的2 21 a[i][x] = 2; 22 continue; 23 } 24 if(i == n+1 || x == n+1) {//同上 25 a[i][x] = 2; 26 continue; 27 } 28 cin >> a[i][x]; 29 if(a[i][x] == 0) a[i][x] = 2;//轉化問題 30 } 31 32 dfs(0,0); 33 for(int i = 1;i <= n; i++){ 34 for(int x = 1;x <= n; x++) 35 cout << a[i][x] << " "; 36 cout << endl; 37 } 38 39 40 return 0; 41 }

洛谷P1162 填塗顏色