来源:http://acm.hdu.edu.cn/showproblem.php?pid=1072
创建了一个点的结构体point用来存储当前坐标和剩余时间及已花费的时间。
很重要的一点就是你得存储到每个点时剩余的时间,这个值由上一个点及自己当前的值确定。
开始没有ac的原因是在经过值为4的点后没有将4变为1,从而陷入死循环,以后要特别注意!
代码如下:
#include<stdio.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
struct point
{
int x,y,cost,time;
};
int map[10][10];//存图
point p[10][10];//最优路线
int dir[4][2]={-1,0,1,0,0,1,0,-1};
int n,m,xx,yy;
void bfs(int x,int y)
{
point a,b;
queue<point>q;
while(!q.empty())q.pop();
a.x=x;a.y=y;a.cost=0;a.time=6;
q.push(a);p[x][y]=a;
while(!q.empty())
{
a=q.front();
q.pop();
if(a.time==1)continue;
for(int i=0;i<4;i++)
{
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
if(map[b.x][b.y]==0||b.x<0||b.x>=n||b.y<0||b.y>=m)continue;
b.cost=a.cost+1;
if(map[b.x][b.y]==4)
{b.time=6;map[b.x][b.y]=1;}//防止无限制增长时间,陷入死循环。
else if(map[b.x][b.y]==1)
b.time=a.time-1;
else
{
b.time=a.time-1;
if(b.cost<p[b.x][b.y].cost||p[b.x][b.y].cost==-1)//筛选出最短时间
{
p[b.x][b.y]=b;
}
}
q.push(b);
}
}
return;
}
int main()
{
int t,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
p[i][j].cost=-1;
if(map[i][j]==2){x=i;y=j;}
if(map[i][j]==3){xx=i;yy=j;}
}
bfs(x,y);
printf("%d\n",p[xx][yy].cost);
}
return 0;
}