zoukankan      html  css  js  c++  java
  • CODE FESTIVAL 2017 qual A D Four Coloring(补题)

    这题看了好几天才看懂,一直误解题解中的d * d了

    题解中说把大的格子划分成d * d的方格,我划分的时候把格子当作点来算的,一直觉得那明明是(d-1) * (d-1),昨天刚反映过来
    思路:把格子旋转45度,坐标扩大sqrt(2)倍,也就是(i,j) - > (i+j,i-j),把曼哈顿距离转换为切比雪夫距离来进行计算。旋转前的曼哈顿距离就是旋转后的切比雪夫距离
    把旋转后的格子划分成d * d的格子后,小格子内方格之间的距离最大为d-1,一个小格子是一个部分,可以涂成相同颜色而不违反题目要求。
    一个d * d的格子有8个邻居的格子,要保证他和这8个格子颜色不同,如果相同了,就不满足题目要求了。
    这时候对颜色的选择,可以根据格子的坐标的奇偶性来选择。
    假设当前格子是(n,n),n是偶数,则周围的格子是(n+1,n),(n-1,n),(n,n+1),(n,n-1),(n+1,n+1),(n-1,n-1),(n+1,n-1),(n-1,n+1)。
    会发现(n,n)左右的格子坐标奇偶性一致,上下的也一致,四个角的格子,奇偶性一致,还有当前格子,正好四部分。
    在代码中计算时,(x%2,y%2)之后,得到的是(0,0),(1,1),(0,1),(1,0)四种坐标,对应二进制的0-3,正好对应四种颜色。

    圆圈组成的格子是旋转后的

    #include <bits/stdc++.h>
    using namespace std;
    
    char color[5] = "RYGB";
    
    int main()
    {
        int h,w,d,x,y;
        scanf("%d %d %d",&h,&w,&d);
        for(int i = 1 ;i <= h; ++i)
        {
            for(int j = 1; j <= w; ++j)
            {
                //映射坐标,+500是防止出现负数,都+500是保持俩数的奇偶性不变
                x = (i+j+500)/d;
                y = (i-j+500)/d;
                //根据坐标奇偶性来判断颜色
                putchar(color[(x%2)*2+y%2]);
            }
            putchar('
    ');
        }
        return 0;
    }
    
    
  • 相关阅读:
    [NOI2001]炮兵阵地
    POJ 2411 Mondriaan's Dream
    【模板】割点(割顶)
    [Noip2007]Core树网的核
    2018.09.09模拟总结
    2018.09.08模拟总结
    [USACO11JAN]Roads and Planes
    最优贸易
    [USACO08JAN]Telephone Lines
    Calabash(葫芦娃)
  • 原文地址:https://www.cnblogs.com/guoyongheng/p/7607073.html
Copyright © 2011-2022 走看看