题目
题解
很容易可以想到对于一个放入的棋子,只要通过判断它上下左右有无棋子块就可得出它将哪几个连通块连了起来。
但是有一种情况我没想到,如下图:
放入的棋子上、左都有棋子,可是上、左的棋子处于同一连通块中,按照原来的判断方法,这一连通块将被重复计算,因此我需要题解。
题解中用深搜把整个连通块都标记,这样连通块就不会被重复了
代码
const
dx:array[1..4]of integer=(0,0,-1,1);
dy:array[1..4]of integer=(1,-1,0,0);
var
n,m,i,j,c,x,y,k,s:longint;
a,b:array[0..501,0..501]of longint;
function find(x,y,c,p:longint):boolean;
var
i,d:longint;
begin
if (x<=0)or(y<=0)or(x>n)or(y>n)or(b[x,y]=p)or(a[x,y]<>c) then exit(false);
b[x,y]:=p;d:=0;
for i:=1 to 4 do
if find(x+dx[i],y+dy[i],c,p) then d:=1;
exit(true);
end;
begin
readln(n,m);
for i:=1 to m do
begin
readln(c,x,y);
inc(k);
for j:=1 to 4 do
if find(x+dx[j],y+dy[j],c+1,i) then
dec(k);
a[x,y]:=c+1;b[x,y]:=i;
writeln(k);
end;
end.