标签:== pre bool stdin [1] 图论 inline cst clu
1.) 图论
设第 \(i\) 个图 \(C\) 逆时针旋转 \(90°\) 得到 \(A\) ,顺时针旋转 \(90°\) 得到 \(B\) ,则第 \(i + 1\) 个图是:
A B
C C
这样就可以把第 \(i\) 张图划分成四个部分。考虑把某个第 \(i\) 个图的坐标代换成第 \(i - 1\) 张图中的坐标,写一个递归即可。
假设输出矩形的长、宽分别为 \(x,y\) ,时间复杂度 \(O(n \cdot xy)\) 。
#include <cstdio>
int P[35];
bool MA[4][4];
bool fun(int n, int x, int y)
{
if (n == 1)
return MA[x][y];
if (x > P[n - 1] && y <= P[n - 1])
return fun(n - 1, x - P[n - 1], y);
if (x > P[n - 1] && y > P[n - 1])
return fun(n - 1, x - P[n - 1], y - P[n - 1]);
if (x <= P[n - 1] && y <= P[n - 1])
return fun(n - 1, y, P[n - 1] - x + 1);
if (x <= P[n - 1] && y > P[n - 1])
return fun(n - 1, P[n] - y + 1, x);
return 0;
}
int main()
{
freopen("graph.in", "r", stdin);
freopen("graph.out", "w", stdout);
int N, A, B, C, D;
scanf("%d%d%d%d%d", &N, &A, &B, &C, &D);
P[0] = 1;
for (int i = 1; i <= N; ++i)
P[i] = P[i - 1] << 1;
MA[1][2] = 1;
for (int i = A; i <= C; ++i) {
for (int j = B; j <= D; ++j)
printf("%d", fun(N, i, j));
printf("\n");
}
return 0;
}
标签:== pre bool stdin [1] 图论 inline cst clu
原文地址:https://www.cnblogs.com/ghcred/p/9505142.html