10.21 连通块 2415

题目

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

题解

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

代码

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值