Open Judge 2815 - 城堡问题 - DFS
2815:城堡问题
- 总时间限制: 1000ms 内存限制: 65536k
- 1 2 3 4 5 6 7
-
#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # # | | | | # #
#############################
(图 1)
# = Wall
| = No wall
- = No wall - 图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙。
- 输入
- 程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证城堡至少有两个房间。
- 输出
- 城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。
思路:将图中的方块看做点,使用DFS遍历图,DFS中,递归时,不再是直接调用DFS,而是分别判断4个方向,分别调用DFS,方向不同,参数也不同
题目所给信息:1表示西墙,2表示北墙,4表示东墙,8表示南墙,则判断方向时使用所给的点对1、2、4、8进行与运算
package graph;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* @ClassName: A_TheCastle.java
* @Description:
* @Author: WangFengyan
* @Version: V1.0
* @Date: 2021年7月19日 下午8:09:11
*/
public class A_TheCastle{
static int _max_mVal = 50;
static int _max_nVal = 50;
static int M,N;
static int [][] srcArr = new int[_max_mVal+1][_max_nVal+1];
static boolean [][] visted = new boolean[_max_mVal+1][_max_nVal+1];
static int roomNum =0,roomArea = 0, maxRoomCnt=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
StringTokenizer st;
while((str = br.readLine()) != null) {
if("".equals(str)) break;
roomNum =0;
maxRoomCnt=0;
roomArea = 0;
st = new StringTokenizer(str);
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for(int i=1;i<=M;i++) {
st = new StringTokenizer(br.readLine());
for(int j=1;j<=N;j++) {
srcArr[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=1;i<=M;i++) {
for(int j=1;j<=N;j++) {
if(visted[i][j]==false){
roomNum++;
roomArea=0;
dfs(i,j);
maxRoomCnt = Math.max(maxRoomCnt, roomArea);
}
}
}
System.out.println(roomNum);
System.out.println(maxRoomCnt);
}
}
static void dfs(int sx, int sy) {
if(!isVal(sx,sy)) return;
if(visted[sx][sy]) return;
roomArea++;
visted[sx][sy] = true;
//根据4个方向dfs
if((srcArr[sx][sy]&1)==0) { //西:左
dfs(sx,sy-1);
}
if((srcArr[sx][sy]&2)==0) { //北:上
dfs(sx-1,sy);
}
if((srcArr[sx][sy]&4)==0) { //东:右
dfs(sx,sy+1);
}
if((srcArr[sx][sy]&8)==0) { //南:下
dfs(sx+1,sy);
}
}
static boolean isVal(int x,int y) {
return x>0 && x<=M && y>0 && y<=N;
}
}
浙公网安备 33010602011771号