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是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(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; 
	}

}


 

  

 

posted @ 2021-09-01 20:06  晓暮云  阅读(81)  评论(0)    收藏  举报