c++描述 一天,一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的。 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。 有以下几点需要说明: 1.每一分钟画家能向四个方向移动一格(上、下、左、右)。 2.每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)。 3.洪水和画家都不能通过岩石区域。 4.画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)。 5. 洪水蔓不到画家的住所。 给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。 输入描述 输入第一行包含两个整数R和C(R,C<=50)。 接下来R行每行包含C个字符(“.”、“*”、“X”、“D”或“S”)。 地图保证只有一个“D”和一个“S”。 输出描述 输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。 用例输入 1 3 3 D.* ... .S. 用例输出 1


这是一个典型的图搜索问题,其中涉及到多步决策和状态转换。我们可以使用广度优先搜索(BFS)来解决这个问题,因为BFS可以找到从起点到终点的最短路径。 具体思路如下: 1. 定义状态:我们需要记录画家当前的位置、当前的时间步以及洪水蔓延的状态。 2. 初始状态:画家位于起始位置,时间为0,洪水尚未进一步蔓延。 3. 终止状态:画家到达住所位置。 4. 状态转换:画家可以向四个方向移动,同时洪水也可以向四个方向蔓延(但不包括岩石位置)。 5. BFS搜索:使用队列进行广度优先搜索,每次取出队列的一个状态,尝试所有可能的移动,生成新的状态,并将新状态加入队列。 以下是用C++实现的代码: ```cpp #include <iostream> #include <vector> #include <queue> #include <tuple> #include <unordered_set> using namespace std; // 四个方向的行列偏移量 const int dx[4] = {-1, 1, 0, 0}; const int dy[4] = {0, 0, -1, 1}; // 检查位置是否合法 bool isValid(int x, int y, int R, int C) { return x >= 0 && x < R && y >= 0 && y < C; } // BFS搜索函数 string bfs(vector<string>& map, int startX, int startY, int endX, int endY) { int R = map.size(); int C = map[0].size(); // 队列中存储 (画家x, 画家y, 时间步, 洪水地图) queue<tuple<int, int, int, vector<string>>> q; // 记录已访问的状态,防止重复搜索 unordered_set<string> visited; // 初始化起点状态 q.push({startX, startY, 0, map}); visited.insert(to_string(startX) + "," + to_string(startY) + "," + to_string(0) + "," + ""); for (string& row : map) { visited.insert(visited.back() + row); } while (!q.empty()) { auto [cx, cy, time, currMap] = q.front(); q.pop(); // 如果画家到达住所 if (cx == endX && cy == endY) { return to_string(time); } // 模拟洪水蔓延 vector<string> nextMap = currMap; for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { if (currMap[i][j] == '.') { bool willFlood = false; for (int k = 0; k < 4; ++k) { int nx = i + dx[k]; int ny = j + dy[k]; if (isValid(nx, ny, R, C) && currMap[nx][ny] == '*') { willFlood = true; break; } } if (willFlood) { nextMap[i][j] = '*'; } } } } // 尝试四个方向移动 for (int k = 0; k < 4; ++k) { int nx = cx + dx[k]; int ny = cy + dy[k]; if (isValid(nx, ny, R, C) && nextMap[nx][ny] != 'X' && nextMap[nx][ny] != '*') { string newKey = to_string(nx) + "," + to_string(ny) + "," + to_string(time + 1) + ","; bool isValidState = true; for (int i = 0; i < R; ++i) { newKey += nextMap[i]; if (visited.find(newKey.substr(0, newKey.size() - C)) != visited.end()) { isValidState = false; break; } } if (isValidState && visited.find(newKey) == visited.end()) { q.push({nx, ny, time + 1, nextMap}); visited.insert(newKey); } } } } // 如果队列为空仍未找到路径,则无法安全回家 return "KAKTUS"; } int main() { int R, C; cin >> R >> C; vector<string> map(R); for (int i = 0; i < R; ++i) { cin >> map[i]; } int startX, startY, endX, endY; for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { if (map[i][j] == 'S') { startX = i; startY = j; } else if (map[i][j] == 'D') { endX = i; endY = j; } } } cout << bfs(map, startX, startY, endX, endY) << endl; return 0; } ``` 逻辑点需要注意: 1. 状态表示:状态需要包括画家位置、时间和洪水地图,确保每个状态是唯一的。 2. 洪水蔓延模拟:在每一时间步,都需要根据当前地图模拟洪水蔓延。 3. 避免重复访问:使用哈希集合记录已访问的状态,避免重复搜索。 [2025-03-16 17:33:49 | AI写代码神器 | 1384点数解答]
- c++描述 一天,一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的。 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。 有以下几点需要说明: 1.每一分钟画家能向四个方向移动一格(上、下、左、右)。 2.每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)。 3.洪水和画家都不能通过岩石区域。 4.画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)。 5. 洪水蔓不到画家的住所。 给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。 输入描述 输入第一行包含两个整数R和C(R,C<=50)。 接下来R行每行包含C个字符(“.”、“*”、“X”、“D”或“S”)。 地图保证只有一个“D”和一个“S”。 输出描述 输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。 用例输入 1 3 3 D.* ... .S. 用例输出 1 (1384点数解答 | 2025-03-16 17:33:49)258
- 题目描述 输入三个整数 x , y , z x,y,z, 如果 x x为奇数,输出 1 ∼ y 1∼y之间的所有数,如果 x x为偶数,输出 1 ∼ z 1∼z之间的所有数。 输入格式 输入包括一行,包含三个整数 x , y , z x,y,z,数字之间用空格隔开。 输出格式 输出包括一行 如果 x x为奇数,输出 1 ∼ y 1∼y之间的所有数,如果 x x为偶数,输出 1 ∼ z 1∼z之间的所有数,输出时,数与数之间用1个空格隔开。 input1 复制 1 10 5 output1 复制 1 2 3 4 5 6 7 8 9 10 input2 复制 4 20 4 output2 复制 1 2 3 4 样例解释 对于样例 1 1: x x是奇数, y = 10 y=10,因此输出 1 ∼ 10 1∼10。 对于样例 2 2: x x是偶数, z = 10 z=10,因此输出 1 ∼ 4 1∼4 。 c++ (391点数解答 | 2025-06-14 09:57:45)160
- 题目描述 输入三个整数 x , y , z x,y,z, 如果 x x为奇数,输出 1 ∼ y 1∼y之间的所有数,如果 x x为偶数,输出 1 ∼ z 1∼z之间的所有数。 输入格式 输入包括一行,包含三个整数 x , y , z x,y,z,数字之间用空格隔开。 输出格式 输出包括一行 如果 x x为奇数,输出 1 ∼ y 1∼y之间的所有数,如果 x x为偶数,输出 1 ∼ z 1∼z之间的所有数,输出时,数与数之间用1个空格隔开。 c++(372点数解答 | 2025-07-06 15:39:04)108
- - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内 (571点数解答 | 2025-08-23 20:54:40)85
- - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内,并且可以增加新的一样的文本(1317点数解答 | 2025-08-23 20:58:40)96
- 题目描述 对于一个数字字符串,如果它满足偶数下标处的数字为偶数且奇数下标处的数字为质数(下标从 0 开始,从左往右依次增大),我们称这它为“好数字”。 比如:"2582" 是“好数字”,因为偶数下标处的数字(下标为 0 的数字为 2、下标为 2 的数字为 8)是偶数,奇数下标处的数字(下标为 1 的数字为 5、下标为 3 的数字为 2)为质数。 但 "3245" 不是“好数字”,因为 3 在偶数下标处但不是偶数。 给你一个整数 n,请你返回长度为 n 且为“好数字”的数字字符串的个数。 由于答案可能会很大,请你将它对 10^9+7 取余后返回 。 注:一个数字字符串是指每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。 输入描述 一个正整数,表示数字字符串的长度 n。 输出描述 一个正整数,表示最终的结果。 样例1 输入 1 输出 5 样例2 输入 5 输出 2000 样例3 输入 50 输出 564908303 提示 对于 100% 的数据,1≤n≤10^9。 请用C++语言完成(457点数解答 | 2025-07-21 17:46:17)93
- 题目描述 对于一个数字字符串,如果它满足偶数下标处的数字为偶数且奇数下标处的数字为质数(下标从 0 开始,从左往右依次增大),我们称这它为“好数字”。 比如:"2582" 是“好数字”,因为偶数下标处的数字(下标为 0 的数字为 2、下标为 2 的数字为 8)是偶数,奇数下标处的数字(下标为 1 的数字为 5、下标为 3 的数字为 2)为质数。 但 "3245" 不是“好数字”,因为 3 在偶数下标处但不是偶数。 给你一个整数 n,请你返回长度为 n 且为“好数字”的数字字符串的个数。 由于答案可能会很大,请你将它对 10^9+7 取余后返回 。 注:一个数字字符串是指每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。 请用C++语言以及快速幂完成 输入描述 一个正整数,表示数字字符串的长度 n。 输出描述 一个正整数,表示最终的结果。 样例1 输入 1 输出 5 样例2 输入 5 输出 2000 样例3 输入 50 输出 564908303 提示 对于 100% 的数据,1≤n≤10^9。(488点数解答 | 2025-07-21 17:50:31)106
- 三倍子串 内存限制: 256 Mb时间限制: 1000 ms 题目描述 给定一个十进制正整数 n n,请问可以从 n n 中截取多少种不同的子串,使得子串构成的数字是 3 3 的倍数。 例如:当 n = 1234 n=1234 时,有且仅有 3 3, 12 12, 123 123, 234 234 这四个子串是 3 3 的倍数。 输入格式 单个整数:表示输入的数字 n n 输出格式 单个整数:表示 3 3 的倍数的子串数量。 数据范围 对于 20 % 20% 的数据, 1 ≤ n ≤ 1 0 9 1≤n≤10 9 ; 对于 50 % 50% 的数据, 1 ≤ n ≤ 1 0 100 1≤n≤10 100 ; 对于 70 % 70% 的数据, 1 ≤ n ≤ 1 0 1000 1≤n≤10 1000 ; 对于 100 % 100% 的数据, 1 ≤ n ≤ 1 0 100000 1≤n≤10 100000 样例数据 输入: 95764 输出: 6 说明: 子串6,9,57,576,957,9576是3的倍数 输入: 1111 输出: 2 说(486点数解答 | 2025-08-29 11:52:55)81
- [问题描述] 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。 [基本要求] (1)要求以顺序栈模拟停车场,以链队列模拟便道。 (2)从终端读入汽车到达或离去的数据,每组数据包括三项:①是“到达”还是“离去”;②汽车牌照号码;③“到达”或“离去”的时刻。与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。 c语言实现(627点数解答 | 2024-07-22 10:38:49)379
- 问题描述] 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。 [基本要求] (1)要求以顺序栈模拟停车场,以链队列模拟便道。 (2)从终端读入汽车到达或离去的数据,每组数据包括三项:①是“到达”还是“离去”;②汽车牌照号码;③“到达”或“离去”的时刻。与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。 c语言实现(4017点数解答 | 2024-07-22 10:49:18)287
- 你见过闪电吗?闪电经常以耀眼的姿势一闪而过。夜里,小南走在回宿舍路上,本是宁静的夜色,猛地一道闪电,闪耀而过。回到宿舍,小南突然很想用代码记下闪电的模样,聪明的你能帮帮他吗? 输入 多组样例。每行一个样例包含一个正整数 n,表示闪电的大小(0<n≤100)。 输出 对于每一个输入的n,输出对应一个大小的闪电,闪电由*组成,两个*之间没有空格。每个输出占一行或者多行,并且每一个闪电后有一行空行。具体输出格式请参考样例。用c语言(256点数解答 | 2024-11-09 17:42:45)143
- 你见过闪电吗?闪电经常以耀眼的姿势一闪而过。夜里,小南走在回宿舍路上,本是宁静的夜色,猛地一道闪电,闪耀而过。回到宿舍,小南突然很想用代码记下闪电的模样,聪明的你能帮帮他吗? 输入 多组样例。每行一个样例包含一个正整数 n,表示闪电的大小(0<n≤100)。 输出 对于每一个输入的n,输出对应一个大小的闪电,闪电由*组成,两个*之间没有空格。每个输出占一行或者多行,并且每一个闪电后有一行空行。具体输出格式请参考样例。用c语言(1026点数解答 | 2024-11-09 17:43:30)179