P1162 填塗顏色

2021-10-22 03:38:51 字數 1830 閱讀 7757

題目描述

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

接下來nnn行,由000和111組成的n×nn \times nn×n的方陣。

方陣內只有乙個閉合圈,圈內至少有乙個000。

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

輸出格式

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

輸入輸出樣例

輸入 #1

60 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

思路:採用標記染色的方法,利用深搜先將陣列裡為1的值標記上,然後利用搜尋將四周最外面的0以及與它相連的0標記上,最後未被標記的就是內部的0,然後把它變為2即可。

#include

using

namespace std;

int a[31]

[31];

int book[31]

[31];

//標記陣列

int n,next[4]

[2]=

,,,}

;void

dfs(

int x,

int y,

int t)

//當前行 當前列 t表示搜尋0或1

}int

main()

for(i=

1;i<=n;i++)}

}//接下來分別在四周的邊上開始搜尋外部的0 將外部的0都標記上

for(i=

1;i<=n;i++

)//在最上邊搜尋

}for

(i=1

;i<=n;i++

)//在最左邊搜尋

}for

(i=1

;i<=n;i++

)//在最下邊搜尋

}for

(i=1

;i<=n;i++

)//在最右邊搜尋

}for

(i=1

;i<=n;i++

)//然後未被標記的肯定是內部的0

for(j=

1;j<=n;j++)if

(book[i]

[j]==0)

//未被標記就把它變為2

a[i]

[j]=2;

for(i=

1;i<=n;i++

)return0;

}

P1162填塗顏色

這還是乙個搜尋題,難度較低,但我提交第三次才ac.觀察0地圖左上角的上面和左面都是一,所以先把他找粗來,然後設成start,然後dfs找到與他聯通的塊,塗成2即可。再說一下自己犯的低階錯誤 1.當找到坐上角時,必須先break掉裡面的for,然後bool變數必須放在第乙個for的裡面,但我放在了上面...

P1162 填塗顏色(dfs)

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

洛谷P1162 填塗顏色

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