Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9311 | Accepted: 4039 |
Description
Input
Output
Sample Input
2
8 8
########
#......#
#.####.#
#.####.#
#.####.#
#.####.#
#...#..#
#S#E####
9 5
#########
#.#.#.#.#
S.......E
#.#.#.#.#
#########
Sample Output
37 5 5
17 17 9
1.题意:有一个迷宫,#代表墙,..代表能走,S是起点,E是终点W为宽,列数H为高;
先输出左转优先时,从S到E的步数
再输出右转优先时,从S到E的步数
最后输出S到E的最短步数
自己写的有很多问题。。后面我发现别人都是用什么数学方法来确定向左还是向右。。我马上就Orz了。。
那些人里面,写的最好的就是这个了点击打开链接。。尼玛,又看了结题报告。。╮(╯▽╰)╭。。。
简直丧心病狂。。剁手。。。好吧。。题外话就不多说了。。。其他的他都说的很详细了。。。我也就
打打酱油吧。。。。。。。。Orz。。。。。。。。。。
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<vector> using namespace std; const int N = 105; char map[N][N]; int vist[N][N]; struct node { int x; int y; int num; }; queue<node>q; node first; int dx[4]={1,-1,0,0}; int dy[4]={0,0,-1,1}; int fx[]= {0,1,0,-1}; int fy[]= {1,0,-1,0}; int fr[]= {1,0,3,2}; int fl[]= {3,0,1,2}; int ans; int t, n, m; int xx, yy; int d; void L_dfs(int x, int y, int d) //靠左墙 { ans++; if( map[x][y] == 'E' ) { printf( "%d", ans ); ans = 0; //记得初始 return ; } for(int i=0; i<4; i++) { int j = ( d + fl[i] ) % 4; xx = x + fx[j]; yy = y + fy[j]; if(xx>=1 && xx<=n && yy>=1 && yy<=m && map[xx][yy]!='#') { L_dfs(xx, yy, j); return ; //少了直接爆掉 } } } void R_dfs(int x, int y, int d) //向右 { ans++; if( map[x][y] == 'E' ) { printf(" %d", ans ); ans = 0; return ; } for(int i=0; i<4; i++) { int j= ( d + fr[i] ) % 4; xx = x + fx[j]; yy = y + fy[j]; if(xx>=1 && xx<=n && yy>=1 && yy<=m && map[xx][yy]!='#') { R_dfs(xx, yy, j); return ; } } } void S_bfs() //最短路径 { memset( vist, false, sizeof( vist ) ); vist[first.x][first.y] = true; while( !q.empty() ) { node temp = q.front(); q.pop(); if( map[temp.x][temp.y]=='E' ) { printf(" %d\n", temp.num+1); break; } for(int i=0; i<4; i++) { xx = temp.x + dx[i]; yy = temp.y + dy[i]; if( xx>=1 && xx<=n &&yy>=1 &&yy<=m && !vist[xx][yy] && map[xx][yy]!='#' ) { node next; next.x = xx; next.y = yy; next.num = temp.num + 1; vist[xx][yy] = true; q.push( next ); } } } } int main() { scanf("%d\n", &t); while( t-- ) { memset( vist, false, sizeof( vist ) ); while( !q.empty() ) q.pop(); scanf("%d%d", &m, &n); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { cin>>map[i][j]; if( map[i][j]=='S' ) { first.x = i; first.y = j; } } first.num = 0; ans = 0; vist[first.x][first.y] = true; q.push( first ); if(first.x==1) d=0; if(first.x==n) d=2; if(first.y==1) d=1; if(first.y==m) d=3; L_dfs( first.x, first.y, d); R_dfs( first.x, first.y, d); S_bfs(); } return 0; }
POJ 3083:Children of the Candy Corn(DFS+BFS),布布扣,bubuko.com
POJ 3083:Children of the Candy Corn(DFS+BFS)
原文地址:http://blog.csdn.net/u013487051/article/details/37907049