| 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