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");
	}
 }