NKOJ 1407 地毯填补问题
思路
实现方法
- 把公主看成障碍物,填的地毯也是障碍物。
- 观察题目发现迷宫大小为 \(2^k \times 2^k\) 格,每次正好可以四等分。
- 每次填充的地毯正好填三格,正好留下一格障碍物。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y;
void solve(int k,int lx,int ly,int nx,int ny){
if(k==0){
return;
}
int t=(1<<k-1);
int rx=lx+t,ry=ly+t;
if(nx<rx&&ny<ry){
//第一区间
printf("%lld %lld 1\n",rx,ry);
solve(k-1,lx,ly,nx,ny);
solve(k-1,lx,ry,rx-1,ry);
solve(k-1,rx,ly,rx,ry-1);
solve(k-1,rx,ry,rx,ry);
}
else if(nx<rx){
//第二区间
printf("%lld %lld 2\n",rx,ry-1);
solve(k-1,lx,ly,rx-1,ry-1);//注意点2
solve(k-1,lx,ry,nx,ny);
solve(k-1,rx,ly,rx,ry-1);
solve(k-1,rx,ry,rx,ry);
}
else if(ny<ry){
//第三区间
printf("%lld %lld 3\n",rx-1,ry);
solve(k-1,lx,ly,rx-1,ry-1);//注意点2
solve(k-1,lx,ry,rx-1,ry);
solve(k-1,rx,ly,nx,ny);
solve(k-1,rx,ry,rx,ry);
}
else{
//第四区间
printf("%lld %lld 4\n",rx-1,ry-1);
solve(k-1,lx,ly,rx-1,ry-1);//注意点2
solve(k-1,lx,ry,rx-1,ry);
solve(k-1,rx,ly,rx,ry-1);
solve(k-1,rx,ry,nx,ny);
}
}
signed main(){
scanf("%lld%lld%lld",&n,&x,&y);
solve(n,1,1,x,y);
return 0;
}
注意事项
- 代码从逻辑上来说很简单,但是细节处理不好就会光荣
WA
。
- 在这里将
ry
写成了 rx
导致光荣 WA
。