拓扑学 应用

方格染色问题

题目

拓扑学 应用_第1张图片

 输入格式

  输入一行包含两个整数n, m,用一个空格分隔。

输出格式

  输出一个整数,表示被染成红色的格子数量。

分析

这种方格染色问题,需要转换思维,才能做出来。

第一步,不管长方形是竖着放,还是横着放,并不影响红色方格的数量。所以,程序输入m,n,统一将大的数作为m,便于之后的计算。

   int n, m, t, hong1, hong2;

   cin >> n >> m;
    if (n > m) {
        t = m;
        m = n;
        n = t;
    }

这段程序就是将输入的m,n按照大小排列。大的值是m,下一步分析m即可。

第二步,如果m是3的倍数,那么因为三种颜色均分了整个地板,那么红色方块就是m*n/3。

    if (m % 3 == 0) {
        hong1 = (m * n) / 3;
        cout << hong1;
    }

第三步,如果m不是3的倍数,m除以3,余数如果是1,那么就等价于第二步算的地板hong1,再加上一列(n个正方形),只需要算这一列有多少个红色。根据图可知,这一列的第一个是红色方块,每三个方块形成一个周期循环。 如果hong2是3 的倍数,红色方块hong2 = n / 3;如果hong2不是3的倍数,因为每次三个方块中第一个是红色方块,那么总共的hong2 = n / 3 + 1

    else if (m % 3 == 1) {
        hong1 = ((m - 1) * n) / 3;
        if (n % 3 == 0)
            hong2 = n / 3;
        else
            hong2 = n / 3 + 1;
        cout << hong1 + hong2;
    }

第四步,如果m不是3的倍数,m除以3,余数如果是2,那么我们补上缺少的一列,便于计算hong1,然后减去之前补上的这一列中的红色方块hong2。补上的这一列,红色方块每次在第2个位置。所以如果n除以3余数是2,红色方块就得再加上1。

    else if (m % 3 == 2) {
        hong1 = ((m + 1) * n) / 3;
        if (n % 3 == 0 || n % 3 == 1)
            hong2 = n / 3;
        else if (n % 3 == 2)
            hong2 = n / 3 + 1;
        cout << hong1 - hong2;
    }

备注:既可以写成    if (n % 3 == 0 || n % 3 == 1),hong2 = n / 3;也可以将这种情况统一作为 (n % 3 == 2)情况的else

解答

#include
using namespace std;

int main() {
    int n, m, t, hong1, hong2;
    cin >> n >> m;
    if (n > m) {
        t = m;
        m = n;
        n = t;
    }

    if (m % 3 == 0) {
        hong1 = (m * n) / 3;
        cout << hong1;
    }

    else if (m % 3 == 1) {
        hong1 = ((m - 1) * n) / 3;
        if (n % 3 == 0)
            hong2 = n / 3;
        else
            hong2 = n / 3 + 1;
        cout << hong1 + hong2;
    }

    else if (m % 3 == 2) {
        hong1 = ((m + 1) * n) / 3;
        if (n % 3 == 0 || n % 3 == 1)
            hong2 = n / 3;
        else if (n % 3 == 2)
            hong2 = n / 3 + 1;
        cout << hong1 - hong2;
    }


    return 0;
}
 

你可能感兴趣的:(c++,蓝桥杯,算法)