这题感觉难度评低了,真正做时才发现还是有点难度的。
题目说:方阵内只有一个闭合圈,圈内至少有一个0。
所以简单点,但还是来一个去掉这句活也可以A的吧。
代码:
const z:array[1..4,1..2]of longint=((0,1),(1,0),(-1,0),(0,-1));
var i,j,k,m,n,t,h:longint;
x,y:array[0..10000]of longint;
a:array[-2..1000,-2..1000]of longint;
b:array[-2..1000,-2..1000]of boolean;
procedure pd(i,j:longint);
var i1,i2,i3,g,h,t:longint;
begin
t:=1;
h:=1;
x[1]:=i;
y[1]:=j;
g:=2;//可以围起来为2
repeat
for i1:=1 to 4 do
if (a[x[t]+z[i1,1],y[t]+z[i1,2]]<>1) and b[x[t]+z[i1,1],y[t]+z[i1,2]] then
begin
inc(h);
x[h]:=x[t]+z[i1,1];
y[h]:=y[t]+z[i1,2];
b[x[t]+z[i1,1],y[t]+z[i1,2]]:=false;
if (a[x[t]+z[i1,1],y[t]+z[i1,2]])=0 then//不可围起来为0
a[x[t]+z[i1,1],y[t]+z[i1,2]]:=3;//为接下来处理
if (a[x[t]+z[i1,1],y[t]+z[i1,2]])=-1 then//没有围起来
g:=0;
end;
inc(t);
until t>h;
for i1:=1 to m do//将g付给一搜过的值
for i2:=1 to m do
if a[i1,i2]=3 then a[i1,i2]:=g;
end;
begin
read(m);
for i:=1 to m do
for j:=1 to m do begin read(a[i,j]); b[i,j]:=true; end;
for i:=1 to m do//围起来一圈
begin
a[i,0]:=-1;//特判
a[i,m+1]:=-1;
a[0,i]:=-1;
a[m+1,i]:=-1;
b[i,0]:=true;//特判方便点
b[i,m+1]:=true;
b[0,i]:=true;
b[m+1,i]:=true;
end;
for i:=1 to m do
for j:=1 to m do
if b[i,j] then pd(i,j);//每个判断
for i:=1 to m do
begin
for j:=1 to m do
write(a[i,j],' ');
writeln;
end;
end.