好久没写博客,主要还是因为周末的考试和昨天生态学实验,忧伤的周末终于过去,更加的忧伤的日子已经来临orz
————写在前面的废话
这个题本来第一眼看是中文的,十分兴奋,结果……到底还是AC率20+%的题啊,理解错一个地方,有楼梯的地方不是只能顺着走,只是顺着走可以省时间1分钟,能不能最后也省时间不一定……挺简洁优雅的广搜
/******
hdu1180
2015.12.7
0MS 1432K 2625 B G++
******/
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int stair[22][22];
struct node
{
int x,y;
int step;
friend bool operator<(node n1,node n2)
{
return n2.step<n1.step;
}
};
int map[22][22];
int n,m;
int dir[4][2]={1,0, 0,-1, -1,0, 0,1};
int x_s,y_s;
int x_e,y_e;
int judge(int x,int y)
{
if(x<0 || x>=n || y<0 || y>=m) return 1;
if(map[x][y]==1) return 1;
if(map[x][y]==2) return 2;
return 0;
}
int judge2(int step,int x2,int y2,int k)
{
if((step+stair[x2][y2])%2!=0 && (k==0 || k==2)) return 1;
if((step+stair[x2][y2])%2==0 && (k==1 || k==3)) return 1;
return 0;
}
int BFS()
{
priority_queue<node>q;
node cur,next;
int temp;
int t_x,t_y;
cur.x=x_s;
cur.y=y_s;
cur.step=0;
map[cur.x][cur.y]=1;
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
if(cur.x==x_e&&cur.y==y_e) return cur.step;
for(int i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
next.step=cur.step;
temp=judge(next.x,next.y);
if(temp==1) continue;
if(!temp)
{
next.step++;
map[next.x][next.y]=1;
q.push(next);
}
else
{
t_x=next.x+dir[i][0];
t_y=next.y+dir[i][1];
if(judge(t_x,t_y)) continue;//就算有楼梯,跳过去是墙也不能走
if(judge2(next.step,next.x,next.y,i))//楼梯方向是顺着的
{
next.x=t_x;
next.y=t_y;
next.step++;
}
else//楼梯的方向是逆着的 但是很幸运接着走可以
{
next.x=t_x;
next.y=t_y;
next.step+=2;
}
q.push(next);
}
}
}
return -1;
}
int main()
{
//freopen("cin.txt","r",stdin);
int i,l;
int ans;
char str[25];
while(scanf("%d%d",&n,&m)!=-1)
{
for(i=0;i<n;i++)
{
scanf("%s",str);
for(l=0;str[l];l++)
{
if(str[l]=='S') {x_s=i;y_s=l;map[i][l]=0;}
else if(str[l]=='T'){x_e=i;y_e=l;map[i][l]=0;}
else if(str[l]=='|'){stair[i][l]=1;map[i][l]=2;}
else if(str[l]=='-'){stair[i][l]=0;map[i][l]=2;}
else if(str[l]=='*')map[i][l]=1;
else if(str[l]=='.')map[i][l]=0;
}
}
int ans=BFS();
printf("%d\n",ans);
}
return 0;
}