NKOJ 1407 地毯填补问题

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;
}

注意事项

  1. 代码从逻辑上来说很简单,但是细节处理不好就会光荣 WA
  2. 在这里将 ry 写成了 rx 导致光荣 WA
posted @ 2024-12-14 09:49  hsr_ray  阅读(35)  评论(0)    收藏  举报