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");
        }
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值