题目连接:http://codevs.cn/problem/1026/
思路:这道题网站吧它归为了广搜 可我广搜学的真的不怎么样 然后我就用深搜写的 感觉深搜也是很简单的
我们从起点开始用一个顺序然后一直找一直找直到碰到障碍或者碰到小镇的墙壁就可以换方向了 如果无路可走那么就返回
最终要的一点是 千万别忘记查重 如果不查重一定超时用一个三维数组f来表示这个点后面能不能行
下面看代码:代码中有许多解释
#include<stdio.h> #include<cstring> char map[60][60]; //记录地图的 char order[1005]; //记录方向的 int m, n, t; bool f[60][60][1005]; //查重的 char diction[8]; void dfs(int a,int b,int cur) { if(cur == t) { map[a][b] = ‘*‘; return ; } if(f[a][b][cur] != 0) return ; f[a][b][cur] = 1; //这个地方千万别忘写了查重用的 没有这个一定超时 if(order[cur] == ‘N‘) { while((a - 1) >= 0&&map[a - 1][b] != ‘X‘) { a--; dfs(a,b,cur + 1); } } else if(order[cur] == ‘S‘) { while((a + 1) < n&&(map[a + 1][b] != ‘X‘)) { a++; dfs(a,b,cur + 1); } } else if(order[cur] == ‘W‘) { while((b - 1) >= 0&&map[a][b - 1] != ‘X‘) { b--; dfs(a,b,cur + 1); } } else if(order[cur] == ‘E‘) { while((b + 1) < m&&map[a][b + 1] != ‘X‘) { b++; dfs(a,b,cur + 1); } } } int main() { int i,j; scanf("%d%d",&n,&m); for(i = 0;i < n;i++) { scanf("%s",map[i]); } scanf("%d",&t); for(j = 0;j < t;j++) { scanf("%s",diction); order[j] = diction[0]; } for(i = 0;i < n;i++) { for(j = 0;j < m;j++) { if(map[i][j] == ‘*‘) break; } if(j != m) break; } map[i][j] = ‘.‘; //这个地方也是非常重要 起点一定要化成.不然也会wrong answer memset(f, 0, sizeof(f)); dfs(i,j,0); for(i = 0;i < n;i++) { for(j = 0;j < m;j++) { printf("%c",map[i][j]); } printf("\n"); } return 0; }
时间: 2024-10-20 11:54:57