题目:给你一个二维的地图,里面有陷阱‘T‘,金子‘G‘以及墙壁‘#‘,和普通的道路‘.‘,现在已知一个人在起点‘P‘;
每次只能走到上下左右4个方向的格子,如果走到一个格子周围有陷阱,人就会停下不走,防止陷阱;
问最多能得到多少金子。
分析:图论,搜索。直接利用dfs求解即可,把‘T‘周围的点标记成停止即可。
说明:╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; char maps[55][55]; int dxy[4][2] = {0,1,1,0,-1,0,0,-1}; bool in_map(int x, int y, int row, int column) { return x >= 0 && x < row && y >= 0 && y < column; } int dfs(int x, int y, int row, int column) { int sum = 0; if (in_map(x, y, row, column) == false || maps[x][y] == '#') { return sum; } sum = maps[x][y] == 'G'; maps[x][y] = '#'; int stop = false; for (int i = 0; i < 4; ++ i) { if (in_map(x+dxy[i][0], y+dxy[i][1], row, column)== true && maps[x+dxy[i][0]][y+dxy[i][1]] == 'T') { stop = true; } } if (stop == true) { return sum; } for (int i = 0; i < 4; ++ i) { sum += dfs(x+dxy[i][0], y+dxy[i][1], row, column); } return sum; } int main() { int row,column; while (~scanf("%d%d",&column,&row)) { for (int i = 0; i < row; ++ i) { scanf("%s",maps[i]); } //寻找起点开始搜索 int find_p = false; for (int i = 0; i < row; ++ i) { for (int j = 0; j < column; ++ j) { if (maps[i][j] == 'P') { printf("%d\n",dfs(i, j, row, column)); find_p = true; break; } } if (find_p == true) break; } } return 0; }
时间: 2024-10-12 18:24:36