题七:欢乐周末

题目:

        小华和小为是很好好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达聚餐地点有多少个?

输入:

        第一行输入m和n,m代表地图的长度,n代表地图宽度
        第二行开始输入地图信息,地图包含:
        0为通畅道路
        1为障碍物(且仅1为障碍物)
        2为小华或者小为,地图中必定有且仅有2个(非障碍物)
        3为被选中的聚餐地点(非障碍物)

输出:

       可以被两方都到达的聚餐地点和数量 

备注:
地图的长宽为m和n,其中
4<=m<=100  ,4<=n<=100  
聚餐的地点数量为k,则
1<k<=100

        

用例:

      4  4                             4  4  
  2  1  0  3                     2  1  2  3
  0  1  2  1                     0  1  0  0
  0  3  0  0                     0  1  0  0   
  0  0  0  0                     0  1  0  0
输出:   2                         0

思路:深度优先搜索

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

public class Main {
 //定义四个方向的偏移量(上下左右)
 private static int[][] dirs = {{-1,0},{1,0},{0,1},{0,-1}};
 
 //深度优先搜索函数
 private static boolean dfs(int currX,int currY,int targetX,int targetY,int[][] map,boolean[][][] visited,int person){
     //如果当前位置就是目标位置,返回true
     if(currX == targetX && currY == targetY){
            return true;
        }

     //遍历四个方向
     for(int[] dir :dirs){
          int nextX = currX + dir[0], nexY = currY + dir[1];
          if(nextX <0 || nextY <0 || nextX >= map.length || nextY >=map[0].length || map[nextX][nextY] == 1 || visited[nextX][nextY][person]){
            continue;
            }
          //标记下一个位置为已访问
         visited[nextX][nextY][person] = true;
        // 递归搜索下一个位置
          if(dfs(nextX,nextY,targetX,targetY,map,visited,person)){
                
              return true;
            }
        }
     return false; 

    }

public static void main(String[] args){
   //初始化输入
   Scanner scanner = new Scanner(System.in);
   int m = scanner.nextInt();
   int n = scanner.nextInt();
   int[][] map = new int[m][n];
  //使用三维数组visited来记录每个人访问的位置
   boolean[][][] visited = new boolean[m][n][2];
   List<int[]> persons = new ArrayList<>();
   List<int[]> targets = new ArrayList<>();
   //读取地图信息,并记录小华小为的位置以及聚餐地点
   for(int i=0;i<m;i++){
      for(int j=0;j<n;j++){
        map[i][j]=scanner.nextInt();
        if(map[i][j]==2){
            persons.add(new int[]{i,j});
        }else if(map[i][j]==3){
            targets.add(new int[]{i,j});
        }
      }
   }
   //获取小华和小为的位置
   int[] xiaohua = persons.get(0);
   int[] xiaowei = persons.get(1);
   int res =0
   //遍历所有聚餐地址
   for(int[] target: targets){
   //重置visited数组
   visited = new boolean[m][n][2];
   //判断小华能否到达目标位置
   if(dfs(xiaohua[0],xiaohua[1],target[0],target[1],map,visited,0)){
     // 重置visitend数组
     visited = new boolean[m][n][2];
     //判断小为能否到达目标位置
      if(dfs(xiaowei[0], xiaowei[1], target[0], target[1], map, visited, 1)){
         //如果两个人都能到达目标位置,结果加1
           res ++;
        }
     }
   }
  
  System.out.println(res);
  scanner.close();  
 }
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值