填涂颜色
題目描述
由數字0 組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2.例如:6X6的方陣(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
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。其中n(1<=n<=30)
接下來n行,由0和1組成的nXn的方陣。
方陣內只有一個閉合圈,圈內至少有一個0。
輸出格式:
已經填好數字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
.
.
.
.
.
.
.
.
分析:
從思路上來說,這題其實挺簡單的。對于任何一個在圈圈內部的點,他的正上方,正下方,正左邊,正右邊都至少有一個1.只有這樣他才能被判定是在圈內部。example(舉了一個長方形的例子,正方形也同理。)
11111000
100010B0
10A01111
10000001
11111111
對于在框內的A來說他的正上,正下,正左,正右都有一個1.所以就可以判斷他在方框內部;而對于B,他的上方和右邊都沒有1,就說明他不在框中。
由于這道題數據比較弱(只有30*30),*所以在不用任何算法的情況下純粹的暴力模擬所有點在時間上也綽綽有余。
算法上對每個點(特別地,一定要判斷這個點本身是不是1.如果他本身就是1,則跳過以下所有步驟)用四個repeat。分別用于枚舉他的四個方向有沒有1.如果四個方向都有1,這個點賦值為2.
.
.
.
.
.
.
.
程序:
var a:array[0..31,0..31]of longint; n,i,j,k:longint;procedure init; beginread(n);for i:=0 to n+1 dobegina[0,i]:=-1;a[i,0]:=-1;a[n+1,i]:=-1;a[i,n+1]:=-1;end;for i:=1 to n dofor j:=1 to n doread(a[i,j]); end;procedure main; beginfor i:=1 to n dofor j:=1 to n dobegink:=0;if a[i,j]=0 thenbeginrepeatk:=k+1;until (a[i-k,j]>0)or(a[i-k,j]=-1);if a[i-k,j]>0 thenbegink:=0;repeatk:=k+1;until (a[i+k,j]>0)or(a[i+k,j]=-1);if a[i+k,j]>0 thenbegink:=0;repeatk:=k+1;until (a[i,j+k]>0)or(a[i,j+k]=-1);if a[i,j+k]>0 thenbegink:=0;repeatk:=k+1;until (a[i,j-k]>0)or(a[i,j-k]=-1);if a[i,j-k]>0 then a[i,j]:=2;end;end;end;end;end;end;procedure print; beginfor i:=1 to n dobeginfor j:=1 to n dowrite(a[i,j],' ');writeln;end; end;begininit;main;print; end.轉載于:https://www.cnblogs.com/YYC-0304/p/9499996.html
總結