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

洛谷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(1n30)

接下來nn行,由00和11組成的n \times nn×n的方陣。

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

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

輸出格式

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

輸入輸出樣例

輸入 #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

說明/提示

1n30

關於思路,放在題解下面了

題解

#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