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.

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章