P2802 回家(dfs,洛谷,java)

洛谷链接:https://www.luogu.com.cn/problem/P2802

在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;
public class Main {
	
	static int n=0,m=0,tx=0,ty=0,lx=0,ly=0,mou=6,times=0,minans=1<<30;  //minans 1乘以2的30次方
	static int[][] a=new int[11][11];
	static int[] dx= {-1,1,0,0};
	static int[] dy= {0,0,-1,1};

	
	public static void dfs(int x,int y,int mou) {
		//如果血量为0或者超出步数上界或者此时的步数已经超过了答案
		if(mou==0 || times>m*n || times>minans)  return;
        
		if(a[x][y]==4)  mou=6;
		if(x==lx && y==ly) { 
			//如果到达终点
			minans=Math.min(times, minans);
		}else {
			for(int i=0;i<4;i++) {
				tx=x+dx[i];
				ty=y+dy[i];
				if(tx<=0 || tx>n || ty<=0 || ty>m || a[tx][ty]==0) continue;  //边界判断和是否撞墙
			    times++;
			    dfs(tx,ty,mou-1);
			    times--;           //回溯
			}
		}
	}
	
	public static void main(String[] args) {	
		Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=m;j++) {
        		a[i][j]=in.nextInt();
        		if(a[i][j]==2) {        //记录开始点
        			tx=i;
        			ty=j;
        		}
        		if(a[i][j]==3) {        //记录结束点
        			lx=i;
        			ly=j;
        		}
        	}
        }
        dfs(tx,ty,mou);
        
        //如果此时 minans 与初值相等,则没有找到可行路径
        if(minans!=1<<30) {
        	System.out.println(minans);
        }else {
        	System.out.println("-1");
        }
	}
}
发布了86 篇原创文章 · 获赞 46 · 访问量 1703

猜你喜欢

转载自blog.csdn.net/weixin_44685629/article/details/104268354
今日推荐