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点数解答]
- [字节豆包] 题目描述 在甜甜圈王国中,每颗甜甜圈都有一个甜度值 S 来衡量其甜蜜程度。根据甜度的不同,甜甜圈被评定为不同的等级,具体规则如下: 如果 S 在 0 到 25 之间(包含 0 和 25 ),输出 "普通甜甜圈"; 如果 S 在 26 到 50 之间(包含 26 和 50 ),输出 "美味甜甜圈"; 如果 S 在 51 到 75 之间(包含 51 和 75 ),输出 "极品甜甜圈"; 如果 S 在 76 到 99 之间(包含 76 和 99 ),输出 "绝世甜甜圈"; 如果 S 等于 100 ,输出 "传说甜甜圈"。 请根据给定的甜度值 S,输出对应的甜甜圈等级名称。 输入格式 一行一个整数 S,表示甜甜圈的甜度值。(243点数解答 | 2025-12-06 18:35:50)59
- [百度文心] 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)377
- [字节豆包] 题目描述 扶苏来到了一个迷宫,这个迷宫是一个 n 行 m 列的数字矩阵,第 i 行第 j 列写有 一个数字 ai,j。保证 1≤ai,j≤4。 扶苏会在这个迷宫的某一个位置。假设她当前在迷宫的第 i 行第 j 列: 如果 ai,j=1,则她会向上移动一行,即 i 减小 1。 如果 ai,j=2,则她会向下移动一行,即 i 增大 1。 如果 ai,j=3,则她会向左移动一列,即 j 减小 1。 如果 ai,j=4,则她会向右移动一列,即 j 增大 1。 初始时和每次移动到另一个格子后,她都会按上述的规则继续进行新的移动。 当她移动出迷宫,即到达第 0 行、第 0 列、第 n+1 行、第 m+1 列时,称她离开了 迷宫。 现在,你要回答 q 次询问,每次给定一个扶苏的初时位置,你要回答她在多少次移动 后会离开迷宫,或报告她永远不会离开迷宫。 输入格式 第一行是三个整数,表示迷宫的行数 n、列数 m 和询问数 q。 接下来 n 行,每行 m 个整数,表示矩阵 a。 接下来 q 行,每行两个整数 xi,yi,表示一次查询初时在第 xi行yi列时她离开迷宫需 要的步数。(819点数解答 | 2025-11-26 19:27:35)51
- [字节豆包] 题目描述 给定m行n列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理: 1.四周最外侧的像素点灰度值不变; 2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均值(四舍五入)。 输入格式 第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1<=n<=100,1<=m<=100。 接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。 输出格式 m行,每行n个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。 输入样例 4 5 100 0 100 0 50 50 100 200 0 0 50 50 100 100 200 100 100 50 50 100 输出样例 100 0 100 0 50 50 80 100 60 0 50 80 100 90 200 100 100 50 50 100 说明/提示 用c++(655点数解答 | 2025-12-01 14:24:01)62
- [字节豆包] 一块 n×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 转 90°:图案按顺时针转 90°。 转 180°:图案按顺时针转 180°。 转 270°:图案按顺时针转 270°。 反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。 组合:图案在水平方向翻转,然后再按照 1∼3 之间的一种再次转换。 不改变:原图案不改变。 无效转换:无法用以上方法得到新图案。 如果有多种可用的转换方法,请选择序号最小的那个。 只使用上述 7 个中的一个步骤来完成这次转换。 输入格式 第一行一个正整数 n。 然后 n 行,每行 n 个字符,全部为 @ 或 -,表示初始的正方形。 接下来 n 行,每行 n 个字符,全部为 @ 或 -,表示最终的正方形。 输出格式 单独的一行包括 1∼7 之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。 输入输出样例 输入 #1复制 3 @-@ --- @@- @-@ @-- --@ 输出 #1复制 1 说明/提示 【数据(817点数解答 | 2025-11-25 19:03:09)47
- [字节豆包] 给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理: 1.四周最外侧的像素点的值不变; 2.中间各像素点新值为该像素点及其上下左右相邻四个像素点值的平均数(向下取整)。 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1≤n≤100,1≤m≤100。 接下来n行,每行m个整数,表示图像的每个像素点的值。相邻两个整数之间用单个空格隔开,每个元素均在0∼255之间。 输出 n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。 样例输入 复制 4 5 100 0 100 0 50 50 100 200 0 0 50 50 100 100 200 100 100 50 50 100 样例输出 复制 100 0 100 0 50 50 80 100 60 0 50 80 100 90 200 100 100 50 50 100(555点数解答 | 2025-12-09 12:22:26)67
- [字节豆包] 题目描述 给定m行n列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理: 1.四周最外侧的像素点灰度值不变; 2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均值(四舍五入)。 输入格式 第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1<=n<=100,1<=m<=100。 接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。 输出格式 m行,每行n个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。 输入样例1 4 5 100 0 100 0 50 50 100 200 0 0 50 50 100 100 200 100 100 50 50 100 输出样例1 100 0 100 0 50 50 80 100 60 0 50 80 100 90 200 100 100 50 50 100 用c++语言 (670点数解答 | 2025-11-10 18:55:33)91
- [字节豆包] 用C++给定一个整数 N N,判断其正负。如果 N > 0 N>0,输出 p o s i t i v e positive; 如果 N = 0 N=0,输出 z e r o zero; 如果 N < 0 N<0,输出 n e g a t i v e negative。 输入 一个整数 N ( − 10 9 ≤ N ≤ 10 9 ) N(−10 9 ≤N≤10 9 )。 输出 如果 N > 0 N>0, 输出 p o s i t i v e positive; 如果 N = 0 N=0, 输出 z e r o zero; 如果 N < 0 N<0, 输出 n e g a t i v e negative。 回答篇幅:越详细越好(610点数解答 | 2026-01-24 22:28:14)34
- [字节豆包] 用C++给定一个整数 N N,判断其正负。如果 N > 0 N>0,输出 p o s i t i v e positive; 如果 N = 0 N=0,输出 z e r o zero; 如果 N < 0 N<0,输出 n e g a t i v e negative。 输入 一个整数 N ( − 10 9 ≤ N ≤ 10 9 ) N(−10 9 ≤N≤10 9 )。 输出 如果 N > 0 N>0, 输出 p o s i t i v e positive; 如果 N = 0 N=0, 输出 z e r o zero; 如果 N < 0 N<0, 输出 n e g a t i v e negative。(150点数解答 | 2026-01-24 22:29:16)37
- [字节豆包] 提示信息: 密码锁:由 n 个从左到右并排的圆环组成,每个圆环上都有 10 个数字(0~9),蓝色框内为密码显示区,每个圆环在密码显示区只能显示一个数字,如图所示。可以拨动圆环,来改变密码显示区显示的数字。 当密码显示区的数字与密码一致时,密码锁就会被打开。 image 编程实现: 有一个由 n 个圆环组成的密码锁,和一个 n 位的密码 S(S 由 1~9 中的数字(包含 1 和 9)组成)。每次操作只能选择一个或位置连续的多个圆环拨动。当 S 中的字符从左到右依次显示在密码显示区时,密码锁会被打开。 已知每个圆环在密码显示区初始数字都为 0,请计算最少需要操作多少次,才能打开密码锁。 注意: 1、如果选择了其中一个圆环,可将该圆环中任意一个数字拨动到密码显示区,表示 1 次操作; 例如:将第 3 个圆环拨动到数字 4,表示 1 次操作: image 2、如果选择了位置连续的多个圆环,只能将这些圆环拨动成同一个数字,显示在密码显示区,表示 1 次操作。 例如:将连续的第 2 个到第 3 个圆环都拨动到数字 5,表示 1 次操作: image 例如: n = 5,S (377点数解答 | 2025-11-08 22:11:16)86
- [字节豆包] 提示信息: 密码锁:由 n 个从左到右并排的圆环组成,每个圆环上都有 10 个数字(0~9),蓝色框内为密码显示区,每个圆环在密码显示区只能显示一个数字,如图所示。可以拨动圆环,来改变密码显示区显示的数字。 当密码显示区的数字与密码一致时,密码锁就会被打开。 image 编程实现: 有一个由 n 个圆环组成的密码锁,和一个 n 位的密码 S(S 由 1~9 中的数字(包含 1 和 9)组成)。每次操作只能选择一个或位置连续的多个圆环拨动。当 S 中的字符从左到右依次显示在密码显示区时,密码锁会被打开。 已知每个圆环在密码显示区初始数字都为 0,请计算最少需要操作多少次,才能打开密码锁。 注意: 1、如果选择了其中一个圆环,可将该圆环中任意一个数字拨动到密码显示区,表示 1 次操作; 例如:将第 3 个圆环拨动到数字 4,表示 1 次操作: image 2、如果选择了位置连续的多个圆环,只能将这些圆环拨动成同一个数字,显示在密码显示区,表示 1 次操作。 例如:将连续的第 2 个到第 3 个圆环都拨动到数字 5,表示 1 次操作: image 例如: n = 5,S (163点数解答 | 2025-11-15 21:22:40)79
- [DeepSeek] 小核桃准备使用 a 数组,存储战力为1~10的守卫各有多少个。 即:a[1] 存储战斗力为1的守卫数量,a[2] 存储战斗力为 2 的守卫数量,... 依次类推,a[10] 存储战斗力为 10 的守卫数量。 请你编写程序,使用数组依次存储战力1~10的守卫数量,并按数组下标顺序(从小到大),依次输出每个守卫的战力。 样例1解释: 样例1 输入数据依次表示:战力为1 的守卫有 3 个,战力为3的守卫有 1 个,战力 为4 的守卫有 2 个,战力为 8 的守卫有 2 个,其余战力为2.5.6.7.9.10的守卫数量都为 0。 所以依次输出 三 个 1,一个 3,两个 4,两个 8。 输入: 十个整数,即1~10中每个数的个数。 输出: 一行若干个整数,为从小到大排好序的数,相邻数字之间用空格隔开。 c++(130点数解答 | 2026-01-17 14:11:22)30