原题传送门:https://www.luogu.com.cn/problem/P1228
思路:因为迷宫的大小是2^k,而且只有一个点本来就有
所以考虑分治。
(以样例为例)
这是一个8*8的矩形,然后我们先把图分成4个4*4的矩形
然后优先递归有公主的那一部分
然后再分,同理
当分成2*2的矩形的时候就可以填了qwq
(填的就是那个绿色的)
然后方便起见(雾),我们在中间点沿着处理好的矩形再铺一次地毯(如图所示)
这样在其他三个2*2的矩形里都有一个“公主”
此时我们到三个2*2的里面填补
然后返回,对其他三个4*4的矩形也是同样的道理
附代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,x,y;
void dg(int x1,int y1,int x2,int y2,int xl,int yl){
if (x2-x1==1){
if (xl==x1 && yl==y1) cout<<x2<<" "<<y2<<" 1\n";
if (xl==x1 && yl==y2) cout<<x2<<" "<<y1<<" 2\n";
if (xl==x2 && yl==y1) cout<<x1<<" "<<y2<<" 3\n";
if (xl==x2 && yl==y2) cout<<x1<<" "<<y1<<" 4\n";
return ;
}
int mx=(x1+x2)>>1,my=(y1+y2)>>1;
if (xl<=mx && yl<=my){
dg(x1,y1,mx,my,xl,yl);
cout<<mx+1<<" "<<my+1<<" 1\n";
dg(x1,my+1,mx,y2,mx,my+1);
dg(mx+1,y1,x2,my,mx+1,my);
dg(mx+1,my+1,x2,y2,mx+1,my+1);
}
if (xl<=mx && yl>my){
dg(x1,my+1,mx,y2,xl,yl);
cout<<mx+1<<" "<<my<<" 2\n";
dg(x1,y1,mx,my,mx,my);
dg(mx+1,y1,x2,my,mx+1,my);
dg(mx+1,my+1,x2,y2,mx+1,my+1);
}
if (xl>mx && yl<=my){
dg(mx+1,y1,x2,my,xl,yl);
cout<<mx<<" "<<my+1<<" 3\n";
dg(x1,y1,mx,my,mx,my);
dg(x1,my+1,mx,y2,mx,my+1);
dg(mx+1,my+1,x2,y2,mx+1,my+1);
}
if (xl>mx && yl>my){
dg(mx+1,my+1,x2,y2,xl,yl);
cout<<mx<<" "<<my<<" 4\n";
dg(x1,y1,mx,my,mx,my);
dg(x1,my+1,mx,y2,mx,my+1);
dg(mx+1,y1,x2,my,mx+1,my);
}
}
int main(){
cin>>n>>x>>y;
int rec=1;
for (int i=1;i<=n;i++) rec<<=1;
dg(1,1,rec,rec,x,y);
return 0;
}