您的位置:首页 > 其它

HDU 1180题 诡异的楼梯

2013-09-19 18:42 330 查看
 题目链接~~>

                     这题其实很简单,在走楼梯时只要判断是否能走就可以,如果不能走,可以选择等下一分钟再走,还有一点就是楼梯不能标记,可以从不同方向过。

代码:

#include<stdio.h>
#include<queue>
using namespace std ;
int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1} ;
char s[25][25] ;
int m,n ;
struct zhang
{
int x,y,bu ;
} ;
int bfs(int x,int y)
{
queue<zhang>q ;
zhang current,next ;
int sx,sy ;
current.x=x ;
current.y=y ;
s[x][y]='*' ;
current.bu=0 ;
q.push(current) ;
while(!q.empty())
{
current=q.front() ;
q.pop() ;
for(int i=0;i<4;i++)
{
next.x=current.x+dx[i] ;
next.y=current.y+dy[i] ;
if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&s[next.x][next.y]!='*')
{
next.bu=current.bu+1 ;
sx=next.x+dx[i] ;
sy=next.y+dy[i] ;
if(s[next.x][next.y]=='|'&&s[sx][sy]!='*')
{
if(current.bu%2&&(i==3||i==2))
{
next.x=sx ;
next.y=sy ;
if(s[sx][sy]=='T')
return next.bu ;
s[sx][sy]='*' ;
q.push(next) ;
}
else if(current.bu%2==0&&(i==0||i==1))
{
next.x=sx ;
next.y=sy ;
if(s[sx][sy]=='T')
return next.bu ;
s[sx][sy]='*' ;
q.push(next) ;
}
else {
next.x=current.x ;
next.y=current.y ;
q.push(next) ;
}
}
else if(s[next.x][next.y]=='-'&&s[sx][sy]!='*')
{
if(current.bu%2==0&&(i==3||i==2))
{
next.x=sx ;
next.y=sy ;
if(s[sx][sy]=='T')
return next.bu ;
s[sx][sy]='*' ;
q.push(next) ;
}
else if(current.bu%2==1&&(i==0||i==1))
{
next.x=sx ;
next.y=sy ;
if(s[sx][sy]=='T')
return next.bu ;
s[sx][sy]='*' ;
q.push(next) ;
}
else {
next.x=current.x ;
next.y=current.y ;
q.push(next) ;
}
}
else if(s[next.x][next.y]=='.')
{
s[next.x][next.y]='*' ;
q.push(next) ;
}
else if(s[next.x][next.y]=='T')
return next.bu ;
}
}
}
return -1 ;
}
int main()
{
int i,j,ax,ay ;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%s",s[i]) ;
for(j=0;j<m;j++)
if(s[i][j]=='S')
{
ax=i ;
ay=j ;
}
}
printf("%d\n",bfs(ax,ay)) ;
}
return 0 ;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: