我也是服了,这道题加上我拖延,竟然整整写了一天!
不过幸好还是写出来了,这题也不太好理解
用分治的思想,真就把一个复杂的问题,一步一步拆成了小问题解决了!
首先,如果是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