这个花费了我一下午的时间写出来的 创作不易情多多支持
1.首先我们需要把思路梳理一遍
小明的位置是变化的 小明位置的变化都会影响的周边的所以我们需要 递归一下 首先确定dfs结束的条件 有2个
dep----是分钟 走一个空格就需要增加1个单位的时间
if(!xue || !map[x][y] ||!vis[x][y])//血量不为空 不是强 不是 已经走过的
if(x<1||x>n||y<1||y>m) 边界判断 return;-------终止
iif(dep>Min) return;----剪枝
if(map[x][y]==3)—如果说已经到达终点那么就取每种路径用时最少的时间
也就是 Min=min(Min,dep);
if(map[x][y]==4)-----移动到鼠标的一个格子的话就满血 赋值xue1=6;
其他的就是非鼠标格子就 xue1=xue-1; 当前的血-1 就是移动到这个
然后记性时间的递增
相邻方向的 时间的增加
走过的路就
vis[x][y]=false;–做个标记
dfs(x,y,dep+1,xue1);
.
.
.
vis[x][y]=true;------回溯一下
在测试方法
要将全部的空格初始化为true
memset(vis,true,sizeof(vis));
#include
using namespace std;
int map[10][10],Min=999999,n,m;
bool vis[10][10];
void dfs(int x,int y,int dep,int xue){
if(!map[x][y]||!vis[x][y]||!xue) return;
if(x<1||x>n||y<1||y>m) return;//边界
if(dep>Min) return;
if(map[x][y]==3){
Min=min(dep,Min);
}
int xue1=xue-1;
vis[x][y]=false;
if(map[x][y]==4) xue=6;
dfs(x-1,y,dep+1,xue1);//上
dfs(x+1,y,dep+1,xue1);//下
dfs(x,y-1,dep+1,xue1);//左
dfs(x,y+1,dep+1,xue1);//右
vis[x][y]=true;
}
int main()
{
int x,y;
memset(vis,true,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>map[i][j];
if(map[i][j]2)
x=i;
y=j;
}
dfs(x,y,0,6);
if(Min999999) cout<<"-1"<<endl;
else cout<<Min<<endl;
}