这个题难想的地方是原地不动的情况。如果这个情况考虑到了,其实问题也就解决了。
之所以用到了优先队列,其原因就是有原地不动的情况,所以我们这里控制时间最优,使用优先队列。
思路:
从起点出发,控制楼梯方向和走向,然后根据当前走的时间判断楼梯方向,然后走向的方向如果能够顺着楼梯走下去,那就走两次。
这里口述可能并不是很清楚,这里对应代码:
void bfs(int x,int y)
{
memset(vis,0,sizeof(vis));
vis[x][y]=1;
now.x=x;
now.y=y;
now.output=0;
priority_queues;
s.push(now);
while(!s.empty())
{
now=s.top();
//printf("%d %d %d\n",now.x,now.y,now.output);
if(a[now.x][now.y]=='T')
{
printf("%d\n",now.output);
return ;
}
s.pop();
for(int i=0;i<5;i++)//0-右、1-左、2、下、3、上。
{
if(i==4)
{
nex.x=now.x;
nex.y=now.y;
nex.output=now.output+1;
s.push(nex);
continue;
}
nex.x=now.x+fx[i];
nex.y=now.y+fy[i];
if(nex.x>=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y
把这么些个情况都考虑到之后,整个思路缜密一些,题目就能够AC了:
#include
#include
#include
using namespace std;
struct zuobiao
{
int x,y,output;
friend bool operator <(zuobiao a,zuobiao b)
{
return a.output>b.output;
}
}now,nex;
int n,m;
int vis[50][50];
char a[50][50];
int fx[4]={0,0,1,-1};//0-右、1-左、2、下、3、上。
int fy[4]={1,-1,0,0};
void bfs(int x,int y)
{
memset(vis,0,sizeof(vis));
vis[x][y]=1;
now.x=x;
now.y=y;
now.output=0;
priority_queues;
s.push(now);
while(!s.empty())
{
now=s.top();
//printf("%d %d %d\n",now.x,now.y,now.output);
if(a[now.x][now.y]=='T')
{
printf("%d\n",now.output);
return ;
}
s.pop();
for(int i=0;i<5;i++)//0-右、1-左、2、下、3、上。
{
if(i==4)
{
nex.x=now.x;
nex.y=now.y;
nex.output=now.output+1;
s.push(nex);
continue;
}
nex.x=now.x+fx[i];
nex.y=now.y+fy[i];
if(nex.x>=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y=0&&nex.x=0&&nex.y