分析问题
1.题目描述
花的排列:有m 组花,每组 蓝、黄、红 3 盆,共3*m 盆
数数规则:
- 从第1盆开始数,数到n 时停下
- 如果数到最后一盆第3*m 盆,就 倒回来 继续数不再重复数最后一盆
- 如果数到第1盆,又 倒回去 继续数不再重复数第1盆
2.关键观察
- 数数的路径 像一条 “折返跑”:
- 去程:1 → 2 → 3 → … →3*m共3*m 步
- 回程: 3m-1 →3m-2 → … → 2共3m-2 步,因为不重复数第1盆和最后一盆
- 完整周期:去程 + 回程 =3m + (3m – 2) = 6*m – 2
4. 确定颜色
- 每3盆颜色循环:蓝1、黄2、红3
- 计算
数量 % 3:如果是正向 - 余1 → 蓝色
- 余2 → 黄色
- 余0 → 红色 如果是反向:
- 余1 → 黄色
- 余2 → 蓝色
- 余0 → 红色
建立模型
| 步骤 | 计算方式 | 说明 |
|---|---|---|
| 1. 总花数 | total= 3m | 共3m 盆花 |
| 2. 周期长度 | cycle= 6m – 2 | 去程 + 回程 |
| 3. 回程调整 | 如果 pos > total,则 pos = 2 * total - pos | 回程时反向计算 |
| 5. 颜色判定(n<3m) | pos % 3 | 1:蓝,2:黄,0:红 |
| 6. 颜色判定(n>3m) | pos % 3 | 1:黄,2:蓝,0:红 |
编写代码
#include <iostream>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
int total = 3 * m; // 总花数
int cycle = 2 * total - 2; // 周期长度
if (n%cycle<=m) //对来回一个周期取模
{// 判断颜色
if (n%l%3==1) cout<<"lan"<<endl;
if (n%l%3==2) cout<<"huang"<<endl;
if (n%l%3==0) cout<<"hong"<<endl;
}
else
{
if (n%l%3==1) cout<<"huang"<<endl;
if (n%l%3==2) cout<<"lan"<<endl;
if (n%l%3==0) cout<<"hong"<<endl;
}
return 0;
}