1代表空地 0代表阻挡物 3代表出口 4代表补给站 问最短路径
因为可以重复走 为了防止超时 要用一个use数组 要是当前的时间比use数组的大 更新use数组的值 相当于剪枝
AC代码:
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct node{
int x;
int y;
int time;
int step;
};
int flag;
int use[10][10];
int way[4][2]={
0,1,0,-1,1,0,-1,0};
int map[10][10];
int sx,sy;
int m,n;
int ans,rm;
queue<node>q;
bool ib(int x,int y)
{
if(x<1||y<1||x>m||y>n)
return 0;
return 1;
}
void bfs()
{
while(!q.empty())
{
q.pop();
}
node n1;
n1.x=sx;
n1.y=sy;
use[sx][sy]=6;
n1.time=6;
n1.step=0;
q.push(n1);
while(!q.empty())
{
node n2=q.front();
q.pop();
node n3;
for(int i=0;i<=3;i++)
{
n3.x=n2.x+way[i][0];
n3.y=n2.y+way[i][1];
n3.step=n2.step+1;
n3.time=n2.time-1;
if(!ib(n3.x,n3.y)||map[n3.x][n3.y]==0)
continue;
if(map[n3.x][n3.y]==1&&n3.time>=use[n3.x][n3.y]&&n3.time>1)
{
use[n3.x][n3.y]=n3.time;
q.push(n3);
}
if(map[n3.x][n3.y]==3)
{
flag=1;
rm=n3.time;
ans=n3.step;
return;
}
if(map[n3.x][n3.y]==4&&use[n3.x][n3.y]<=n3.time&&n3.time>0)
{
n3.time=6;
use[n3.x][n3.y]=6;
q.push(n3);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
flag=0;
memset(use,0,sizeof(use));
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
sx=i;
sy=j;
}
}
bfs();
if(flag==1&&rm>0)
{
printf("%d\n",ans);
}
else
printf("-1\n");
}
}