http://acm.hdu.edu.cn/showproblem.php?pid=1180
迷宫 就多了个楼梯的问题 可以停在原点 楼梯是瞬间通过
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 25;
const int inf = 1<<30;
int n,m;
char map[maxn][maxn];
int xs[] = {0,1,0,-1};
int ys[] = {1,0,-1,0};
struct node
{
int x,y;
int g;
bool operator < ( const node &k ) const
{
return g > k.g;
}
};
int BFS( int sx,int sy )
{
node cur,cnt;
priority_queue<node>que;
cur.x = sx; cur.y = sy;
cur.g = 0;
que.push(cur);
while( !que.empty() )
{
cur = que.top(); que.pop();
for( int i = 0; i < 4; i ++ )
{
cnt.x = cur.x + xs[i];
cnt.y = cur.y + ys[i];
if( cnt.x >= 1 && cnt.x <= n && cnt.y >= 1 && cnt.y <= m && map[cnt.x][cnt.y] != '*' )
{
if( map[cnt.x][cnt.y] == 'T' )
return cur.g + 1;
else if( map[cnt.x][cnt.y] == '|' )
{
if( cur.g %2 && (i == 0 || i == 2) )
cnt.g = cur.g + 1;
else if( !(cur.g%2) && ( i == 1 || i == 3 ) )
cnt.g = cur.g + 1;
else
cnt.g = cur.g + 2;
cnt.x = cnt.x + xs[i];
cnt.y = cnt.y + ys[i];
if( map[cnt.x][cnt.y] == 'T' )
return cnt.g;
que.push(cnt);
}
else if( map[cnt.x][cnt.y] == '-' )
{
if( !(cur.g %2) && (i == 0 || i == 2) )
cnt.g = cur.g + 1;
else if( cur.g%2 && ( i == 1 || i == 3 ) )
cnt.g = cur.g + 1;
else
cnt.g = cur.g + 2;
cnt.x = cnt.x + xs[i];
cnt.y = cnt.y + ys[i];
if( map[cnt.x][cnt.y] == 'T' )
return cnt.g;
que.push(cnt);
}
else
{
cnt.g = cur.g + 1;
que.push(cnt);
map[cnt.x][cnt.y] = '*';
}
}
}
}
return -1;
}
int main()
{
//freopen("data.txt","r",stdin);
int sx,sy;
while( scanf("%d%d",&n,&m) == 2 )
{
for( int i = 1; i <= n; i ++ )
{
getchar();
for( int j = 1; j <= m; j ++ )
{
scanf("%c",&map[i][j]);
if( map[i][j] == 'S' )
{
sx = i; sy = j;
}
}
}
int ans = BFS( sx,sy );
if( ans != -1 )
printf("%d\n",ans);
}
return 0;
}