码迷,mamicode.com
首页 > 其他好文 > 详细

比赛-thh学长的训练赛2 (20 Aug, 2018)

时间:2018-08-20 14:29:45      阅读:418      评论:0      收藏:0      [点我收藏+]

标签:==   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;
}

比赛-thh学长的训练赛2 (20 Aug, 2018)

标签:==   pre   bool   stdin   [1]   图论   inline   cst   clu   

原文地址:https://www.cnblogs.com/ghcred/p/9505142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!