P2802 回家(洛谷)
作者:互联网
题目传送门:
https://www.luogu.com.cn/problem/P2802
题解思路:
AC代码:
#include<iostream> #include<algorithm> #include<string> using namespace std; int n,m; int a[10][10]; //储存地图 int color[10][10]={0}; //标记用,防止出现重复走动而死循环的情况 //注意 虽然有标记但是这里是搜索路径问题 所以在每层的dfs结束时都需要进行回溯 int xue=6; //初始的血量为6 int path=120; //最短路长 // int step=0; int dx[4]={-1,0,1,0}; int dy[4]={0,-1,0,1}; void dfs(int i,int j,int xue,int step){ //先判断是否死亡 if(xue<=0) return; //直接退出 if(step>=n*m) return;//剪枝操作 if(step>path) return;//剪枝操作 if(a[i][j]==3){ if(path>step){//剪枝操作 path=step; //更新最小路径 } return; } if(a[i][j]==4) xue=6; //血量加满 for(int k=0;k<4;k++){ int tx=i+dx[k]; int ty=j+dy[k]; if(a[tx][ty]!=0){ dfs(tx,ty,xue-1,step+1); } } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i][j]==2){ //出发地 dfs(i,j,6,0); break; } } } if(path==120){ //表示没回家 cout<<"-1"; } else{ cout<<path; } return 0; }
标签:10,洛谷,剪枝,int,P2802,回家,xue,step,path 来源: https://www.cnblogs.com/xwh-blogs/p/13657350.html