您的位置:首页 > 其它

【重走普及路】【xfs】填充颜色

2015-12-27 12:40 344 查看


题目描述

由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0      0 0 0 0 0 0
0 0 1 1 1 1      0 0 1 1 1 1
0 1 1 0 0 1      0 1 1 2 2 1
1 1 0 0 0 1      1 1 2 2 2 1 
1 0 0 0 0 1      1 2 2 2 2 1
1 1 1 1 1 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

虽然这道题标签是bfs,打的都不知道是什么fs了。。。
读入时把0改成2,然后每找到一个2,进行一次xfs。。。弄个队列把能达到的点都加进去,如果搜到边界,把队列里的赋为0

(机智如我)


</pre><pre name="code" class="plain">
const fx:array[1..4,1..2] of integer=((1,0),(0,1),(-1,0),(0,-1));
type sz=record
x:longint;
y:longint;
end;
var n,i,j,t,k:longint;
p:boolean;
f:array[1..900] of sz;
a,b:array[1..31,1..31] of longint;

procedure ok(x,y:longint);
var i,x1,y1:longint;
begin
for i:=1 to 4 do begin
x1:=x+fx[i,1];
y1:=y+fx[i,2];
if (x1>=1)and(x1<=n)and(y1>=1)and(y1<=n)and(a[x1,y1]=2)and(b[x1,y1]=0) then begin
inc(t);
f[t].x:=x1;
f[t].y:=y1;
b[x1,y1]:=1;
ok(x1,y1);
end else if (x1<1)or(x1>n)or(y1<1)or(y1>n) then begin
p:=false;
end;
end;
end;

begin
readln(n);
for i:=1 to n do begin
for j:=1 to n do begin
read(a[i,j]);
if a[i,j]=0 then a[i,j]:=2;
end;
readln;
end;
for i:=1 to n do begin
for j:=1 to n do begin
if a[i,j]=2 then begin
p:=true;
t:=1;
fillchar(f,sizeof(f),0);
fillchar(b,sizeof(b),0);
b[i,j]:=1;
f[1].x:=i;
f[1].y:=j;
ok(i,j);
if not p then for k:=1 to t do a[f[k].x,f[k].y]:=0;
end;
end;
end;
for i:=1 to n do begin
for j:=1 to n do write(a[i,j],' ');
writeln;
end;
{q1:=1;
q2:=1;
while q1<=q2 do begin
q3:=q2+1;
for i:=q1 to q2 do begin

end;
end;  }
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pascal 普及 搜索