描述
爱丽丝和鲍勃经常在棋盘上玩游戏。有一天,爱丽丝画了一张大小为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.