题目描述
小华和小为是很要好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达)。求小华和小为都能到达的聚餐地点有多少个?
输入描述
第一行输入两个整数 m 和 n,分别代表地图的长度和宽度(4 ≤ m, n ≤ 100)。
接下来 m 行,每行输入 n 个数字,表示地图的具体信息:
0:通畅的道路
1:障碍物(且仅 1 为障碍物)
2:小华或小为的位置(地图中必定有且仅有2个)
3:被选中的聚餐地点(非障碍物,数量 k 满足 1 < k ≤ 100)。
输出描述
-
输出一个整数,表示小华和小为都能到达的聚餐地点数量,行末无空格。
输入:
4 4
2 1 0 3
0 1 2 1
0 3 0 0
0 0 0 0
输出:
2
说明 :地图中有两个聚餐地点(3),两人均可到达,故输出 2。
代码思路
java
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
int[][] nums = new int[m][n];
for (int i=0;i<m;i++){
for(int j=0;j<n;j++){
nums[i][j] =in.nextInt();
}
}
boolean[][] v1=new boolean[m][n];
boolean[][] v2=new boolean[m][n];
int x=1;
for (int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(nums[i][j]==2){
if(x==1){
dfs(nums,v1,m,n,i,j);
x++;
}else{
dfs(nums,v2,m,n,i,j);
}
}
}
}
int res =0;
for (int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(nums[i][j]==3&&v1[i][j]&&v2[i][j]){
res++;
}
}
}
System.out.println(res);
}
public static void dfs(int[][] nums,boolean[][] visit,int m,int n,int x,int y){
if(x<0||x>=m||y<0||y>=n||nums[x][y]==1||visit[x][y]){
return;
}
visit[x][y] =true;
dfs(nums,visit,m,n,x+1,y);
dfs(nums,visit,m,n,x-1,y);
dfs(nums,visit,m,n,x,y+1);
dfs(nums,visit,m,n,x,y-1);
}
}