POJ_2446 Chessboard

描述

爱丽丝和鲍勃经常在棋盘上玩游戏。有一天,爱丽丝画了一张大小为M * N的纸板。她希望鲍勃用大量1 * 2大小的卡片来盖住纸板。不过,她觉得这样太容易了,于是她在板子上留下了一些洞(如下图所示)。

我们称一个网格,它不包含一个洞,一个正常的网格。鲍勃必须遵守以下规则:
1.任何正常的电网应该只有一张卡。
2.一张卡应该正好覆盖两个正常的相邻网格。

下图给出了一些例子:

一个有效的解决方案。

一个无效的解决方案,因为红色的孔被卡覆盖。

一个无效的解决方案,因为存在一个网格,这是不覆盖。

你的任务是帮助鲍勃决定是否可以按照上述规则覆盖棋盘。
输入

第一行有3个整数:m,n,k(0

var
 mmap:Array[0..1501,0..1501]of longint;
 way:array[0..5,0..2]of longint;
 map,aa:array[0..1501,0..1501]of boolean;
 cover:array[0..1501] of boolean;
 link:array[0..1501] of longint;
 i,j,n,s,t,x,y,m,k,sum:longint;
function find(i:longint):boolean;
var
 q,k:longint;
begin
 find:=true;
 for k:=1 to sum do
   begin
     if (map[i,k])and(not(cover[k])) then
       begin
         cover[k]:=true;
         q:=link[k];
         link[k]:=i;
         if (q=0)or(find(q)) then exit;
         link[k]:=q;
       end;
   end;
 exit(false);
end;

procedure wayy;
begin
 way[1,1]:=1; way[1,2]:=0;
 way[2,1]:=0; way[2,2]:=1;
 way[3,1]:=-1; way[3,2]:=0;
 way[4,1]:=0; way[4,2]:=-1;
end;

begin
 wayy;
 read(m,n,k);
 for i:=1 to k do
   begin
     read(x,y);
     aa[x,y]:=true;
   end;
 for i:=1 to n do
  for j:=1 to m do
   if not(aa[i,j]) then
    begin
      inc(sum);
      mmap[i,j]:=sum;
    end;
 for i:=1 to n do
  for j:=1 to m do
   if not(aa[i,j]) then
   for t:=1 to 4 do
     begin
       if not(aa[i+way[t,1],j+way[t,2]]) then
        if (i+way[t,1]>0)and(i+way[t,1]<n+1)and
         (j+way[t,2]>0)and(j+way[t,2]<m+1) then
           begin
             map[mmap[i,j],mmap[i+way[t,1],j+way[t,2]]]:=true;
           end;
     end;
 for i:=1 to sum do
   begin
     fillchar(cover,sizeof(cover),0);
     if not(find(i)) then
       begin
         write('NO');
         halt;
       end;
   end;
 {for i:=1 to sum do
  if link[i]=0 then
    begin
      write('NO');
      halt;
    end;      }
 write('YES');
end.

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值