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