我也是服了,这道题加上我拖延,竟然整整写了一天!
不过幸好还是写出来了,这题也不太好理解
用分治的思想,真就把一个复杂的问题,一步一步拆成了小问题解决了!
首先,如果是2x2的格子最简单,不管在哪里,都有一种地毯填补;不管是4x4还是8x8,都能拆分成很多个2x2。
所以我们要做的就是先判断(x,y)在哪里方向,(比起判断0<x<len,好像的确用x-a,y-b更简便些)确定之后就能确定一个地毯,将这个地毯的三块分别看作公主站位,递归解决对应方向的所有格子
上图:
输出的坐标,x,y,a,b转换后的坐标很容易出错(哭
void dfs(ll x,ll y,ll a,ll b,ll len) {
if(len<1) return;
if(x-a<=len-1&&y-b<=len-1) {
cout<<a+len<<' '<<b+len<<' '<<1<<endl;
dfs(x,y,a,b,len/2);
dfs(a+len-1,b+len,a,b+len,len/2);
dfs(a+len,b+len-1,a+len,b,len/2);
dfs(a+len,b+len,a+len,b+len,len/2);
//对应四个方向
}
else if(x-a<=len-1&&y-b>len-1) {
cout<<a+len<<' '<<b+len-1<<' '<<2<<endl;
dfs(a+len-1,b+len-1,a,b,len/2);
dfs(x,y,a,b+len,len/2);
dfs(a+len,b+len-1,a+len,b,len/2);
dfs(a+len,b+len,a+len,b+len,len/2);
}
else if(x-a>len-1&&y-b<=len-1) {
cout<<a+len-1<<' '<<b+len<<' '<<3<<endl;
dfs(a+len-1,b+len-1,a,b,len/2);
dfs(a+len-1,b+len,a,b+len,len/2);
dfs(x,y,a+len,b,len/2);
dfs(a+len,b+len,a+len,b+len,len/2);
}
else {
cout<<a+len-1<<' '<<b+len-1<<' '<<4<<endl;
dfs(a+len-1,b+len-1,a,b,len/2);
dfs(a+len-1,b+len,a,b+len,len/2);
dfs(a+len,b+len-1,a+len,b,len/2);
dfs(x,y,a+len,b+len,len/2);
}
return;
}
int main() {
ll x,y,len=1;
int k;
cin>>k>>x>>y;
while(--k) len<<=1;//特别把他设为了长度的一半,简化代码
dfs(x,y,1,1,len);
return 0;
}