#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 地毯填补问题进阶解法
最新推荐文章于 2022-01-19 10:43:18 发布