【DFS】Java解决The Castle城堡问题(IOI 1994、POJ1164)
创始人
2025-05-31 13:04:11
0

文章目录

  • 问题描述
  • 解决思路
  • DFS遍历图的递归算法框架
  • Java代码

问题描述

题目来源于1994年IOI信息学奥林匹克竞赛。
POJ1166 题目提交网址:http://poj.org/problem?id=1164
在这里插入图片描述
Figure 1 shows the map of a castle.Write a program that calculates

  1. how many rooms the castle has
  2. how big the largest room is

The castle is divided into m * n (m<=50, n<=50) square modules. Each such module can have between zero and four walls.
Input
Your program is to read from standard input. The first line contains the number of modules in the north-south direction and the number of modules in the east-west direction. In the following lines each module is described by a number (0 <= p <= 15). This number is the sum of: 1 (= wall to the west), 2 (= wall to the north), 4 (= wall to the east), 8 (= wall to the south). Inner walls are defined twice; a wall to the south in module 1,1 is also indicated as a wall to the north in module 2,1. The castle always has at least two rooms.
Output
Your program is to write to standard output: First the number of rooms, then the area of the largest room (counted in modules).
Sample Input
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
Sample Output
5
9

解决思路

把方块看成节点,相邻的两个方块如果之间没有墙,则在方块之间连接一条边,这样城堡就能转换成一个图。
题目中给出的“地图”即可转换为如下图所示的图,寻找城堡数即转换为寻找极大联通子图的数量。
在这里插入图片描述

根据深度优先搜索的算法,从一个节点出发,便可以找到该节点的极大联通子图,并做标记(以防重复寻找),然后继续寻找下一个节点所在极大联通子图。

思路:依次对每一个节点(房间)开始进行深度优先搜索,给该节点的极大联通子图上色,并全部标记为旧节点,然后继续寻找下一个为被搜索的节点(房间)。
在这里插入图片描述
上图中可以看出一共有5个房间(极大联通子图),最大的有9个节点

DFS遍历图的递归算法框架

DFS(V){if(V是旧节点) return;将V标记为旧节点;对和V相邻的每个节点U{DFS(U);}
}
int main(){初始化;将所有节点标记为新点;while(图中能找到新点W){DFS(W);}
}

Java代码


import java.util.Scanner;public class Main {public static void main(String[] args) {Solution solution = new Main().new Solution();int R,C;Scanner scanner = new Scanner(System.in);R = scanner.nextInt(); // 几行C = scanner.nextInt(); // 几列int[][] rooms = new int[R][C];for (int i = 0; i < R; i++) {for (int j = 0; j < C; j++) {rooms[i][j] = scanner.nextInt();}}solution.solve(R,C,rooms);}class Solution{int R,C;int maxRoomArea = 0;int colorNum = 0;int roomArea = 0; // 用于临时记录个房间的大小int[][] colors,rooms; // rooms 原始房间地图  colors用于记录颜色()public void solve(int R,int C,int[][] rooms){this.R = R;this.C = C;this.maxRoomArea = 0; // 最大房间的大小this.colorNum = 0; // 颜色序号,0为未上色(没有搜过),this.roomArea = 0;this.colors = new int[R][C]; // 默认初始化所有点为0this.rooms = rooms;for(int i = 0;i < R;i++){for(int j = 0;j < C;j++){if(colors[i][j]==0){ // 找到一个新节点colorNum++; // roomArea = 0;DFS(i,j);maxRoomArea = Math.max(maxRoomArea,roomArea);}}}System.out.println(colorNum);System.out.println(maxRoomArea);}public void DFS(int i,int j) {if(colors[i][j] != 0)return; // 旧点,返回colors[i][j] = colorNum; // 上色roomArea++; if(((rooms[i][j]) & 1) ==0) DFS(i,j-1); // 向左找if(((rooms[i][j]) & 2) ==0) DFS(i -1 ,j); // 向上找if(((rooms[i][j]) & 4) ==0) DFS(i,j+1); if(((rooms[i][j]) & 8) ==0) DFS(i + 1,j);}}
}

在这里插入图片描述
参考: 《算法基础与在线实践》刘家瑛等

相关内容

热门资讯

走进小城看消费丨江西资溪:低碳...   夏日时节下午4点,江西省抚州市资溪县大觉山景区漂流终点依然热闹。来自南昌的游客余鑫漂流结束后没有...
【中原晨会0625】市场分析专... 来源:市场资讯 (来源:中原证券研究所) 本期重点研报目录 【中原策略】市场分析:电子半导体领涨 ...
南向资金连买4日!低费率+可月... 6月25日早盘,港股红利资产震荡整理。截至11时14分,港股红利低波ETF招商(520550)下跌0...
618成交破百万!紫荆花用一套... 一年一度的618年中大促,是消费市场的晴雨表,也是品牌间最激烈的角力场。当各大品牌在直播间里铆足了劲...
原创 黄... 2026年6月25日的国际金价已经从前期的5500美元高点跌到4200美元下方,累计跌幅超过22%,...
英伟达CEO:Vera Rub... 截至9:38,中证半导体材料设备主题指数(931743)涨2.36%创新高;权重股中,中微公司涨3....
再被催债16亿!“钢铁大王”戴... 澎湃新闻记者 贺梨萍 因“铁本事件”入狱五年的戴国芳重返钢铁行业,但他并没有完成从阶下囚再到“钢铁大...
周三原油价格下跌 随着美国和伊朗在和平谈判中取得进展,越来越多的油轮公开穿越霍尔木兹海峡,原油在战时的价格上涨已经蒸发...
这种蛋白是大脑衰老的开关 这种蛋白是大脑衰老的开关 清晨,假设一位五十岁左右的王女士发现自己常常把手机放在熟悉的抽屉里又找不到...
信通院牵头算力Token出海生... 盘面上,截至11:04,中证科创创业50指数(931643)涨1.68%,创历史新高;权重股中,芯原...
海外 774 亿营收背后:日本... 文 | 游戏价值论 6月23日,彭博社报道了腾讯正在围绕出售多家日本游戏工作室少数股权开展谈判,包...
餐饮“抢人”大战:把店开到公交... 作者 |餐饮老板内参 内参君 医院、公交站、演唱会…餐饮品牌,正在无孔不入 在北京儿童医院,肯德基...
快讯 | 外资扫货!陈翊庭:港... 港交所行政总裁陈翊庭在接受《中国证券报》专访时指出,国际资本对中国资产的看法已彻底扭转,布局中国市场...
2777.77元!A股“股王”... 25日早盘,昨天创下历史新高的A股“股王”联讯仪器,今天上午继续走强,盘中股价再度刷新历史新高。 截...
原创 今... 欧洲自己的媒体直接下结论,欧盟衰退躲不掉,内部分裂拦不住,现在就连欧洲顶尖工业巨头,都偷偷在用中国的...
黄仁勋股东大会放言:本轮AI基... 在当地时间6月24日的英伟达(NVDA.O)2026年度股东大会上,股东批准了该公司全部10名董事会...
国际油价大跌 新华社消息, 纽约原油期货主力合约价格24日盘中跌破每桶70美元,为伊朗战事爆发以来首次。 市场分析...
马云带队插秧,什么信号? 一场别开生面的“务农”,让外界看到了一个不一样的阿里巴巴。 近日,阿里巴巴合伙人、高德董事长刘振飞在...
全球最大产能,最高丰度达99.... 本文转自【科技日报】; 6月23日,高丰度硼-10同位素技术暨产业化成果发布会在山东省东营市举办,全...
黄金大跳水!金饰克价年内暴跌近... 25日,现货黄金盘中震荡,截至发稿,报3985.070美元/盎司,跌0.17%。 当地时间24日,...