拓扑学 应用

这篇博客介绍了如何解决方格染色问题,通过转换思维,将输入的长方形按照最大边为m进行分析。当m是3的倍数时,红色方块数量为m*n/3;若m除以3余1,则需要考虑额外一列的染色情况;若m除以3余2,需要补足一列并计算红色方块数量。博客提供了详细的步骤和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方格染色问题

题目

 输入格式

  输入一行包含两个整数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 <iostream>
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;
}

一日一图

代码如下:

import math
import turtle as t
  
# 设置画布和画笔
screen = t.Screen()
 
  
t.tracer(False)#这个语句成立的前提是import turtle as 
 

mylist=[]
x,y=0,1
while x<100:
    x,y=x+y,y
    mylist.append(x)

for i in mylist:
    t.circle(i,180)
    
# 隐藏画笔
#t.hideturtle()
# 保持窗口
screen.mainloop()

生成图如下:

心得
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值