题目:
小华和小为是很好好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达聚餐地点有多少个?
输入:
第一行输入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();
}
}