10.21 连通块 2415

来源:互联网 发布:填色软件 编辑:程序博客网 时间:2024/05/22 06:53

  • 题目
  • 题解
  • 代码

题目

这里写图片描述
这里写图片描述

题解

很容易可以想到对于一个放入的棋子,只要通过判断它上下左右有无棋子块就可得出它将哪几个连通块连了起来。
但是有一种情况我没想到,如下图:
这里写图片描述
放入的棋子上、左都有棋子,可是上、左的棋子处于同一连通块中,按照原来的判断方法,这一连通块将被重复计算,因此我需要题解。
题解中用深搜把整个连通块都标记,这样连通块就不会被重复了

代码

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.
原创粉丝点击