HDU1035——Robot Motion
题目描述
运行代码
#include <iostream>
#include <cstring>
using namespace std;
char map[10][10];
int flag[10][10];
int x, y;
// 模拟过程
void dfs(int a, int b) {
if (a < 0 || a >= x || b < 0 || b >= y) {
return;
}
flag[a][b]++;
if (flag[a][b] == 3) {
return;
}
if (map[a][b] == 'N') {
dfs(a - 1, b);
}
else if (map[a][b] == 'S') {
dfs(a + 1, b);
}
else if (map[a][b] == 'E') {
dfs(a, b + 1);
}
else if (map[a][b] == 'W') {
dfs(a, b - 1);
}
}
int main() {
int in;
while (cin >> x >> y && x != 0 && y != 0) {
cin >> in;
memset(flag, 0, sizeof(flag));
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
cin >> map[i][j];
}
}
int a = 0, b = in - 1;
dfs(a, b);
int t = 0, p = 0;
// 判断循环
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (flag[i][j] == 1) {
t++;
}
if (flag[i][j] >= 2) {
p++;
}
}
}
if (p > 0) {
cout << t << " step(s) before a loop of " << p << " step(s)" << endl;
}
else {
cout << t << " step(s) to exit" << endl;
}
}
return 0;
}
代码思路
-
初始化:
map
数组保存网格的布局。flag
数组跟踪在模拟过程中每个单元格被访问的次数。x
和y
存储网格的尺寸。
-
读取输入:
- 程序读取网格的尺寸
x
和y
,以及机器人初始位置in
。 - 它接着将网格布局读入
map
数组。
- 程序读取网格的尺寸
-
深度优先搜索(DFS):
dfs
函数是递归实现的深度优先搜索。- 它检查当前位置 (
a
,b
) 是否在网格的边界内。 - 它增加当前位置在
flag
数组中的访问计数。 - 如果访问计数达到3,它返回,阻止从这个单元格进一步的递归调用。
- 根据
map
中当前位置的字符,它递归地调用dfs
来使机器人向北、南、东或西移动。
-
主循环:
- 它重复读取输入直到
x
和y
都为0,这表示输入的结束。 - 在处理每个新网格前,它使用
memset
清空flag
数组。 - 它从计算出的初始位置
(0, in - 1)
开始 DFS。
- 它重复读取输入直到
-
结果计算:
- DFS 后,它统计恰好被访问一次的单元格数量 (
t
) 和被访问超过一次的单元格数量 (p
)。 - 如果
p
大于0,这意味着存在循环,输出显示进入循环前走过的步数和循环的长度。 - 如果
p
是0,意味着没有遇到循环,输出显示可能退出网格所走过的总步数。
- DFS 后,它统计恰好被访问一次的单元格数量 (
HDU1036——Average is not Fast Enough!
题目描述
运行代码
#include <algorithm> // 标准算法库
#include <iostream> // 输入输出流库
#include <cstring> // 字符串操作库
#include <cstdio> // C风格输入输出库
#include <ctime> // 时间处理库
#include <set> // 集合容器库
#include <map> // 映射容器库
#include <cmath> // 数学函数库
using namespace std;
int n, h, m, s, num, flag, t; // 声明整型变量
char str[150]; // 声明字符数组
int main(){
double d, sum, time; // 声明双精度浮点型变量
scanf("%d %lf", &n, &d); // 输入测试案例数量和距离
while (~scanf("%d", &num)){ // 循环读取每个案例的编号
sum = 0.0; // 初始化总时间
t = n; // 复制案例数量
flag = 1; // 设置标志位为真
h = m = s = 0; // 将时、分、秒初始化为0
while (flag && t--){ // 当标志位为真且t不为0时执行循环
if (3 == scanf("%d:%d:%d", &h, &m, &s)){ // 尝试读取时、分、秒
sum += h * 3600 + m * 60 + s; // 计算并累加总秒数
} else { // 如果读取失败
gets(str); // 清理输入缓冲区
flag = 0; // 设置标志位为假
}
}
printf("%3d: ", num); // 打印案例编号
if (flag){ // 如果标志位仍为真
if (d != 0){ // 如果距离非零
time = sum / d + 0.5; // 计算时间并进行四舍五入
} else {
time = 0; // 如果距离为零,则时间设为0
}
printf("%d:%02d min/km\n", (int)time / 60, (int)time % 60); // 打印结果
} else {
printf("-\n"); // 如果数据读取错误,打印错误标记
}
}
return 0; // 主函数结束返回0
}
代码思路
首先读取一个整数 n
和一个浮点数 d
,分别表示时间记录的数量和距离。然后,对于每一个 num
(案例编号),它尝试从标准输入读取 n
组时间数据(时、分、秒)。如果所有数据都成功读取,它会计算出总时间,并根据 d
计算出每公里的时间。如果在读取过程中遇到任何问题,它将输出一个错误标记。最后,程序将打印出每公里的时间(分钟和秒),或者在读取失败的情况下打印 -
。
HDU1037——Keep on Truckin'
题目描述
运行代码
#include <iostream>
using namespace std;
int main() {
int u1, u2, u3;
cin >> u1 >> u2 >> u3;
int H = 168;
if (u1 >= H && u2 >= H && u3 >= H) {
cout << "NO CRASH" << endl;
}
else if (u1 <= H) {
cout << "CRASH " << u1 << endl;
}
else if (u2 <= H) {
cout << "CRASH " << u2 << endl;
}
else {
cout << "CRASH " << u3 << endl;
}
return 0;
}
代码思路
-
输入读取:从标准输入读取三个整数
u1
,u2
,u3
。 -
条件判断:
- 首先检查所有输入值是否都大于或等于
H
(168)。如果是,则输出 "NO CRASH",表示没有发生所谓的“碰撞”。 - 接下来,逐一检查每个输入值:
- 如果
u1
小于或等于H
,则输出 "CRASH" 后跟上u1
的值。 - 如果
u2
小于或等于H
并且u1
已经被检查过(即u1
大于H
),则输出 "CRASH" 后跟上u2
的值。 - 最后,如果前两个条件都没有触发(即
u1
和u2
都大于H
),并且u3
小于或等于H
,则输出 "CRASH" 后跟上u3
的值。
- 如果
- 首先检查所有输入值是否都大于或等于
-
输出:根据上述条件,输出相应的信息。