棋盘覆盖的分治
相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的各自迷宫,国王选择驸马的方法非常特殊,也非常简单:公主站在其中一个方格子上,只要谁能用地毯将除公主站立的地方意外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一方格不能用地毯盖住,毯子的形状有所规定,只能有4种选择,如下图所示:
并且每一方格只能用一层地毯,迷宫的大小为(2^k)^2的方形。当然,也不能让公主无限制地在那儿等,所以实现时限为1s。
输入文件共2行。第一行:k,即给定被填补迷宫的大小为2^k(0<k<=10);第二行:x y,即给出公主所在方格的坐标(x为行坐标,y为列坐标),x和y之间有一个空格隔开。
输出文件包括将地毯填补完整的方案,每一行为x y c(x,y为毯子拐角的行坐标和列坐标,c为使用毯子的形状,具体见上面的图,毯子形状分别用1、2、3、4表示,x、y、c之间用一个空格隔开)。输出时按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.
浙公网安备 33010602011771号