描述
愛麗絲和鮑勃經常在棋盤上玩遊戲。有一天,愛麗絲畫了一張大小爲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.