Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10997 | Accepted: 4736 |
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
这末一道题竟然做了一天,看来智商还是硬伤啊,但这次和以往的不同的是没有看一点题解,做完漫漫的成就感,不说了,直接上题意,
‘#’说明这个点是墙,不可走, ‘.’说明是通路,可走,S 为 地图的起点,E 为地图的终点,求:
靠着左边的墙走,求走的步数,即输出的第一个数
然后靠着右边的墙走,求走的步数,即输出的第二个数
其实也挺简单的,就是在控制行走方向上有点难度,基本上用了DFS 和 BFS 搜索
第三个数就是最短路了
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; struct node { int x,y; int step; }; char Map[45][45]; bool vis[45][45]; int m,n; int px,py; int Step_Left,Step_Right,Step_min; int Dir[][2] = {{0,1},{1,0},{0,-1},{-1,0}}; bool Judge(int x,int y) { if(x >= 0 && x < n && y >= 0 && y < m && Map[x][y] != '#') return true; return false; } void DFS_Left(int step,int dir,int x,int y) { if(Map[x][y] == 'E') { Step_Left = step; return ; } dir--; dir = (dir + 4) % 4; for(int i=0;i<4;i++) { int d = (dir + i + 4) % 4; int fx = x + Dir[d][0]; int fy = y + Dir[d][1]; if(Judge(fx,fy)) { DFS_Left(step+1,d,fx,fy); break; } } } void DFS_Right(int step,int dir,int x,int y) { if(Map[x][y] == 'E') { Step_Right = step; return ; } dir++; dir %= 4; for(int i=0;i<4;i++) { int d = (dir - i + 4) % 4; int fx = x + Dir[d][0]; int fy = y + Dir[d][1]; if(Judge(fx,fy)) { DFS_Right(step+1,d,fx,fy); break; } } } void BFS() { memset(vis,false,sizeof(vis)); queue<node >que; node a,b; a.x = px; a.y = py; a.step = 1; vis[a.x][a.y] = true; que.push(a); while(!que.empty()) { a = que.front(); que.pop(); if(Map[a.x][a.y] == 'E') { Step_min = a.step; return ; } for(int i=0;i<4;i++) { b.x = a.x + Dir[i][0]; b.y = a.y + Dir[i][1]; b.step = a.step + 1; if(Judge(b.x,b.y) && !vis[b.x][b.y]) { vis[b.x][b.y] = true; que.push(b); } } } } int main() { //freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { memset(Map,0,sizeof(Map)); scanf("%d%d",&m,&n); for(int i=0;i<n;i++) { scanf("%s",Map[i]); for(int j=0;j<m;j++) { if(Map[i][j] == 'S') { px = i; py = j; } } } if(px == 0) { DFS_Left(1,2,px,py); DFS_Right(1,2,px,py); } else if(px == n-1) { DFS_Left(1,0,px,py); DFS_Right(1,0,px,py); } else if(py == 0) { DFS_Left(1,1,px,py); DFS_Right(1,1,px,py); } else if(py == m-1) { DFS_Left(1,3,px,py); DFS_Right(1,3,px,py); } BFS(); printf("%d %d %d\n",Step_Left,Step_Right,Step_min); } return 0; }