#include<iostream>
#include<cmath>
using namespace std;
int k, x, y;
void cover1(int k, int d, int m, int n)
{
int N = pow(2, k);
if (k == 0)
{
cout << m + 1 << ' ' << n + 1 << ' ';
switch (d)
{
case(1):cout << 2; break;
case(2):cout << 3; break;
case(3):cout << 1; break;
case(4):cout << 4; break;
}
cout << endl;
}
else switch (d)
{
case(1):
cover1(k - 1, 1, m, n);
cover1(k - 1, 1, m - N / 2, n + N / 2);
cover1(k - 1, 3, m, n + 2 * N - 1);
cover1(k - 1, 4, m - 2 * N + 1, n);
break;
case(2):
cover1(k - 1, 2, m, n);
cover1(k - 1, 2, m + N / 2, n - N / 2);
cover1(k - 1, 3, m + 2 * N - 1, n);
cover1(k - 1, 4, m, n - 2 * N + 1);
break;
case(3):
cover1(k - 1, 3, m, n);
cover1(k - 1, 3, m - N / 2, n - N / 2);
cover1(k - 1, 2, m - 2 * N + 1, n);
cover1(k - 1, 1, m, n - 2 * N + 1);
break;
case(4):
cover1(k - 1, 4, m, n);
cover1(k - 1, 4, m + N / 2, n + N / 2);
cover1(k - 1, 2, m, n + 2 * N - 1);
cover1(k - 1, 1, m + 2 * N - 1, n);
}
}
void cover2(int k, int m, int n)
{
int N = pow(2, k);
if (k == 0)
return;
else if (x - m < N / 2 && y - n < N / 2)
{
cover2(k - 1, m, n);
cover1(k - 1, 3, m + N - 1, n + N - 1);
}
else if (x - m >= N / 2 && y - n < N / 2)
{
cover2(k - 1, m + N / 2, n);
cover1(k - 1, 2, m, n + N - 1);
}
else if (x - m < N / 2 && y - n >= N / 2)
{
cover2(k - 1, m, n + N / 2);
cover1(k - 1, 1, m + N - 1, n);
}
else if (x - m >= N / 2 && y - n >= N / 2)
{
cover2(k - 1, m + N / 2, n + N / 2);
cover1(k - 1, 4, m, n);
}
}
int main()
{
cin >> k >> x >> y;
x--;
y--;
cover2(k, 0, 0);
return 0;
}
洛谷P1228 地毯填补问题进阶解法
最新推荐文章于 2024-11-24 15:32:01 发布
该博客主要探讨了一个使用递归算法解决的二维区域覆盖问题。代码中定义了两个函数`cover1`和`cover2`,通过递归调用来完成不同方向的子区域覆盖。输入参数包括递归深度`k`,以及坐标`x`和`y`。在递归过程中,根据当前深度和方向进行不同子区域的划分和调用。该问题涉及递归、算法和二维空间处理。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
ACE-Step
音乐合成
ACE-Step
ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言
501

被折叠的 条评论
为什么被折叠?



