输入输出样例
输入
3 3
2 1 1
1 1 0
1 1 3
输出
4
参考的是某个博主的思路
#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
#include<queue>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int a[15][15]={0};//构造地图
int vis[15][15]={0}; //记录该点的血量
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
bool flag=false;
struct node{
int dx,dy,step,hp;
}ans,t;
queue<node> q;
void bfs(int n,int m)
{
while(!q.empty()&&!flag)
{
t=q.front();
q.pop();
if(t.hp==1)continue;//hp=1了,已经没戏了,这次就跳过去吧;
for(int i=0;i<4&&!flag;i++)
{
if(a[t.dx+dir[i][0]][t.dy+dir[i][1]])//这个点不是障碍物
if(vis[t.dx+dir[i][0]][t.dy+dir[i][1]]<t.hp-1)//如果血量更大,可以试试
{
ans.dx = t.dx+dir[i][0];
ans.dy = t.dy+dir[i][1];
ans.step=t.step+1;
ans.hp = a[ans.dx][ans.dy]==4?6:t.hp-1;
vis[ans.dx][ans.dy]=ans.hp;
if(a[ans.dx][ans.dy]==3)flag=true;
q.push(ans);
}
}
}
}
int main()
{
int n,m,ax,ay;
cin >> n >> m ;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >> a[i][j] ;
if(a[i][j]==2)
ax=i,ay=j;
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout << a[i][j] << " ";
}
cout << endl ;
}*/
q.push(node({ax,ay,0,6}));
vis[ax][ay]=6;
bfs(n,m);
if(flag)cout << ans.step << endl ;
else cout << "-1" << endl ;
return 0;
}