转向游戏II/n/n## 题目描述/n/n小明自认为方向感很好,请小红来测试。小红先让小明面对'东'方立正站好,然后发出 '向左转'、'向右转' 或 '向后转' 的命令。每个命令执行后,小明都正确地说出了他面对的方向。/n命令是以数字方式表达:$0$ 代表 '向右转',$1$ 代表 '向左转',$2$ 代表 '向后转'。/n/n## 输入格式/n/n从标准输入读入数据。/n输入共两行。第一行是一个正整数 $n$($1//le n//le 10,000$),代表命令的条数;第二行是 $n$ 个整数,每个整数是 $0$、$1$ 或 $2$,代表小红发出的口令。/n/n## 输出格式/n/n输出到标准输出。/n一个整数,代表小明回答 '北' 的次数。/n/n## 样例 #1/n/n### 样例输入 #1/n/n/n5/n0 1 0 0 1/n/n/n### 样例输出 #1/n/n/n0/n/n/n## 提示/n/n## 子任务/n对于 $30//%$ 的数据,$n//le10$;/n对于 $50//%$ 的数据,$n//le100$;/n对于 $70//%$ 的数据,$n//le1,000$;/n对于 $100//%$ 的数据,$n//le10,000$。/n特别地,对于其中 $20//%$ 的数据,小红发出的命令仅有一种。/n/n## 解题报告/n/n### 思路/n/n题目要求我们求出小明面对的方向。由于小明一开始面对的方向是东,我们可以用一个变量 d 来记录小明当前面对的方向,然后根据小红的命令来更新方向。具体来说:/n/n- 如果小红发出的是向右转的命令,那么小明面对的方向顺时针旋转 $90^/circ$,也就是当前方向加上 $1$。由于小明面对的方向只有东、南、西、北四个方向,因此我们可以用取模的方式来实现这个旋转。即 d = (d + 1) % 4。/n- 如果小红发出的是向左转的命令,那么小明面对的方向逆时针旋转 $90^/circ$,也就是当前方向减去 $1$。由于小明面对的方向只有东、南、西、北四个方向,因此我们需要特殊处理减法的结果。即 d = (d + 3) % 4。/n- 如果小红发出的是向后转的命令,那么小明面对的方向旋转 $180^/circ$,也就是当前方向加上 $2$ 或减去 $2$。同样地,我们需要特殊处理减法的结果。即 d = (d + 2) % 4。/n/n最后,我们只需要统计小明回答 '北' 的次数即可。/n/n### 代码/n/nc++/n#include <iostream>/nusing namespace std;/n/nint main() {/n int n;/n cin >> n;/n int cmds[n];/n for (int i = 0; i < n; i++) {/n cin >> cmds[i];/n }/n/n int d = 0; // 初始方向:东/n int cnt = 0; // 统计回答北的次数/n/n for (int i = 0; i < n; i++) {/n if (cmds[i] == 0) {/n d = (d + 1) % 4;/n } else if (cmds[i] == 1) {/n d = (d + 3) % 4;/n } else {/n d = (d + 2) % 4;/n }/n if (d == 0) {/n cnt++;/n }/n }/n/n cout << cnt << endl;/n return 0;/n}/n/n/n### 复杂度分析/n/n时间复杂度:$O(n)$。/n/n空间复杂度:$O(1)$。/n

C++ 编程题:转向游戏 II - 详解与代码

原文地址: https://www.cveoy.top/t/topic/knp4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录