You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
4.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
//功能: 通过不断的判断公主的位置完成对棋盘进行L形的填充,要求填充完整,不能有遗漏,不能冒出去棋盘。
//参数:棋盘左上,棋盘右下,公主位置
void dfs(int x1, int y1, int x2, int y2, int gz_x, int gz_y) {
//变成了2*2(递归出口)
if (x2 - x1 == 1 && y2 - y1 == 1) {
//具体用哪号地毯,可以参考题解上方的地毯图形说明
if (gz_x == x1 && gz_y == y1) printf("%d %d 1\n", x2, y2); //公主在左上,1号地毯
if (gz_x == x1 && gz_y == y2) printf("%d %d 2\n", x2, y1); //公主在右上,2号地毯
if (gz_x == x2 && gz_y == y1) printf("%d %d 3\n", x1, y2); //公主在左下,3号地毯
if (gz_x == x2 && gz_y == y2) printf("%d %d 4\n", x1, y1); //公主在右下,4号地毯
return;//最后一块铺完Game Over~ 递归出口
}
//取出中心点,举个栗子5~8则(8-5)/2+5=6,就是5~8之间的中心点是6靠近小的那边
int mid_x = (x2 - x1) / 2 + x1;
int mid_y = (y2 - y1) / 2 + y1;
//接下来就是分治特殊点的位置,往那个方向搜索。
if (gz_x <= mid_x && gz_y <= mid_y) { //公主在左上
dfs(x1, y1, mid_x, mid_y, gz_x, gz_y); //递归左上角
printf("%d %d 1\n", mid_x + 1, mid_y + 1); //放上去一个1号地毯相当于构建了三个虚拟的公主
dfs(mid_x + 1, y1, x2, mid_y, mid_x + 1, mid_y); //左下角(虚拟公主在左下角的右上角)
dfs(mid_x + 1, mid_y + 1, x2, y2, mid_x + 1, mid_y + 1);//右下角(虚拟公主在右下角的左上角)
dfs(x1, mid_y + 1, mid_x, y2, mid_x, mid_y + 1); //右上角(虚拟公主在右上角的左下角)
}
if (gz_x <= mid_x && gz_y > mid_y) { //右上
dfs(x1, mid_y + 1, mid_x, y2, gz_x, gz_y); //递归右上角
printf("%d %d 2\n", mid_x + 1, mid_y); //放上去一个2号地毯相当于构建了三个虚拟的公主
dfs(x1, y1, mid_x, mid_y, mid_x, mid_y); //左上角 (虚拟公主在左上角的右下角)
dfs(mid_x + 1, y1, x2, mid_y, mid_x + 1, mid_y); //左下角 (虚拟公主在左下角的右上角)
dfs(mid_x + 1, mid_y + 1, x2, y2, mid_x + 1, mid_y + 1); //右下角 (虚拟公主在右下角的左上角)
}
if (gz_x > mid_x && gz_y <= mid_y) { //左下
dfs(mid_x + 1, y1, x2, mid_y, gz_x, gz_y); //递归左下角
printf("%d %d 3\n", mid_x, mid_y + 1); //放上去一个3号地毯相当于构建了三个虚拟的公主
dfs(mid_x + 1, mid_y + 1, x2, y2, mid_x + 1, mid_y + 1); //右下角(虚拟公主在右下角的左上角)
dfs(x1, y1, mid_x, mid_y, mid_x, mid_y); //左上角(虚拟公主在左上角的右下角)
dfs(x1, mid_y + 1, mid_x, y2, mid_x, mid_y + 1); //右上角(虚拟公主在右上角的左下角)
}
if (gz_x > mid_x && gz_y > mid_y) { //右下
dfs(mid_x + 1, mid_y + 1, x2, y2, gz_x, gz_y);//递归右下角
printf("%d %d 4\n", mid_x, mid_y); //放上去一个4号地毯相当于构建了三个虚拟的公主
dfs(x1, y1, mid_x, mid_y, mid_x, mid_y); //左上角(虚拟公主在左上角的右下角)
dfs(x1, mid_y + 1, mid_x, y2, mid_x, mid_y + 1); //右上角(虚拟公主在右上角的左下角)
dfs(mid_x + 1, y1, x2, mid_y, mid_x + 1, mid_y); //左下角(虚拟公主在左下角的右上角)
}
}
int main() {
int x, y; //公主的位置
int k; //2^k是棋盘的大小
cin >> k >> x >> y;
//递归
int n = 1 << k; //计算n=2^k,用位运算更快
//开始铺地毯的坐标x1,y1;结束铺地毯的坐标x2,y2; 最后两个参数是公主的位置
dfs(1, 1, n, n, x, y);
return 0;
}