棋盘覆盖的分治

相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的各自迷宫,国王选择驸马的方法非常特殊,也非常简单:公主站在其中一个方格子上,只要谁能用地毯将除公主站立的地方意外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一方格不能用地毯盖住,毯子的形状有所规定,只能有4种选择,如下图所示:

 (4种L型)

    并且每一方格只能用一层地毯,迷宫的大小为(2^k^2的方形。当然,也不能让公主无限制地在那儿等,所以实现时限为1s

    输入文件共2行。第一行:k,即给定被填补迷宫的大小为2^k0<k<=10);第二行:x y,即给出公主所在方格的坐标(x为行坐标,y为列坐标),xy之间有一个空格隔开。

    输出文件包括将地毯填补完整的方案,每一行为x  y  cx,y为毯子拐角的行坐标和列坐标,c为使用毯子的形状,具体见上面的图,毯子形状分别用1234表示,xyc之间用一个空格隔开)。输出时按X坐标优先,X坐标相同再按Y坐标从小到大排序.

【输入输出样例】

blank.in

3

3  3

blank.out

1  1  4

1  4  3

1  5  4

1  8  3

2  2  4

2  7  3

3  6  3

4  1  2

4  4  1

4  8  1

5  1  4

5  5  1

5  8  3

6  3  2

6  6  1

7  2  2

7  7  1

8  1  2

8  4  1

8  5  2

8  8  1

var
k,n,x,y,i,j:longint;
map:
array[1..1024,1..1024] of integer;

procedure find(x1,y1,x2,y2,x,y:integer);
var
i,j,xm,ym,p:integer;
begin
p:
=0;
if x2-x1=1 then
begin
if (x=x2) and (y=y2) then
begin map[x1,y1]:=4; map[x1+1,y1]:=-1; map[x1,y1+1]:=-1; end else
if (x=x1) and (y=y1) then
begin map[x2,y2]:=1; map[x2,y2-1]:=-1; map[x2-1,y2]:=-1; end else
if (x=x1) and (y=y2) then
begin map[x2,y1]:=3; map[x2-1,y1]:=-1; map[x2,y1+1]:=-1; end else
begin map[x1,y2]:=2; map[x1,y2-1]:=-1; map[x1+1,y2]:=-1; end;
exit;
end;
xm:
=(x1+x2) div 2;
ym:
=(y1+y2) div 2;
if (x>=x1) and (x<=xm) and (y>=y1) and (y<=ym) then
begin find(x1,y1,xm,ym,x,y); p:=1; end else
find(x1,y1,xm,ym,xm,ym);
if (x>=x1) and (x<=xm) and (y>ym) and (y<=y2) then
begin find(x1,ym+1,xm,y2,x,y); p:=2; end else
find(x1,ym
+1,xm,y2,xm,ym+1);
if (x>xm) and (x<=x2) and (y>=y1) and (y<=ym) then
begin find(xm+1,y1,x2,ym,x,y); p:=3; end else
find(xm
+1,y1,x2,ym,xm+1,ym);
if (x>xm) and (x<=x2) and (y>ym) and (y<=y2) then
begin find(xm+1,ym+1,x2,y2,x,y); p:=4; end else
find(xm
+1,ym+1,x2,y2,xm+1,ym+1);
if p=1 then
begin map[xm+1,ym+1]:=1; map[xm,ym+1]:=-1; map[xm+1,ym]:=-1; end else
if p=4 then
begin map[xm,ym]:=4; map[xm+1,ym]:=-1; map[xm,ym+1]:=-1; end else
if p=3 then
begin map[xm,ym+1]:=2; map[xm+1,ym+1]:=-1; map[xm,ym]:=-1; end else
begin map[xm+1,ym]:=3; map[xm+1,ym+1]:=-1; map[xm,ym]:=-1; end;
end;

begin
readln(k);
n:
=1;
for i:=1 to k do
n:
=n*2;
readln(x,y);
find(
1,1,n,n,x,y);
for i:=1 to n do
for j:=1 to n do
if map[j,i]>0 then
writeln(i,
' ',j,' ',map[j,i]);
end.

posted on 2011-08-31 17:01  kid_jiao  阅读(234)  评论(0)    收藏  举报

导航