深度优先搜索之入门问题->城堡问题
来源:互联网 发布:java分布式开发技术 编辑:程序博客网 时间:2024/04/30 13:23
转载:北京大学暑期课 ACM/ICPC竞赛训练
题目描述
编写一个程序,计算城堡一共有多少个房间,最大的房间有多大.城堡被分割成m*n(m<=50,n<=50)个方块,每个方块可以有0~4面墙.
输入
1) 程序从标准输入设备读入数据
2) 在第一行是两个整数,分别是南北向,东西向的 方块数
3)接下来的输入行中,每个方块用一个数字(0<=p<=50)描述.每个方块用代表其周围墙的数字之和表示.墙使用一个数字表示: 1表示西墙,2表示北墙,4表示东墙,8表示南墙.
4)输入的数据保证城堡至少有两个房间
输出
1)城堡的房间数,城堡中最大房间所包括的方块数
2)结果显示在标准输出设备上
输入样例
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
输出样例
5
9
解题思路
对于每个房间,深度优先搜索,从而给这个房间能够到达的所有位置染色.最后统计一共用了几种颜色,以及每种颜色的数量.
具体理解详细看代码
代码详解
#include <iostream>#include <cstring>#include <stack>using namespace std;int R, C; //城堡的长和宽int room[50][50]; //房间数量int color[50][50]; //判断是否染色(判重)int roomNum = 0; //房间数int roomArea = 0; //房间的方块数int roomAreaMax = 0; //最大房间方块数void castle_dfs(int i, int j){ if (color[i][j]) return; ++roomArea; color[i][j] = roomNum; if ((room[i][j] & 1) == 0) castle_dfs(i, j - 1); //向西走 if ((room[i][j] & 2) == 0) castle_dfs(i - 1, j); //向北走 if ((room[i][j] & 4) == 0) castle_dfs(i, j + 1); //向东走 if ((room[i][j] & 8) == 0) castle_dfs(i + 1, j); //向南走 /************************************** 1.因为1,2,4,8的二进制0001,0010,0100,1000分别表示四种属性 2.使用&来检测属性,然后判断方向 ***************************************/}void max_area(int roomArea, int &roomAreaMax){ if (roomArea > roomAreaMax) roomAreaMax = roomArea;}int main(){ //输入部分 cin >> R >> C; //输入长宽 for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { cin >> room[i][j]; //方块号 } } //计算部分 for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { roomArea = 0; //需要初始化 if (!color[i][j]) { ++roomNum; //房间数加1 castle_dfs(i, j); max_area(roomArea, roomAreaMax); } } } cout << roomNum << endl; cout << roomAreaMax << endl; return 0;}
阅读全文
0 0
- 深度优先搜索之入门问题->城堡问题
- 深度优先搜索之城堡问题
- 城堡问题 ------ 深度优先搜索
- 深度优先搜索(POJ1164 城堡问题)
- 深度优先搜索--算法(城堡问题 poj1164)
- 搜索之城堡问题
- 深度优先搜索之部分和问题
- 深度优先搜索1-城堡问题(算法基础 第6周)
- HDU1269--迷宫城堡--深度优先搜索
- 开开心心学算法--深度优先搜索(DFS)之滑雪问题
- 数据结构之深度优先搜索(用栈实现)问题
- 深度优先搜索入门
- 深度优先搜索入门
- 迷宫问题|深度优先搜索&广度优先搜索
- 树:深度优先搜索、广度优先搜索、背包问题
- 【深度优先搜索】最小皇后问题
- Matlab 深度优先搜索求解迷宫问题
- 深度优先搜索----部分和问题
- Ubuntu16.04安装R及RStudio
- 无法言表<SET集合的使用>
- 单选框回显
- 正则表达式之小括号
- 20170715_HTTP协议消息头与消息体分析
- 深度优先搜索之入门问题->城堡问题
- JZOJ__Day 10:【普及模拟】【USACO】横幅
- 陈岷愿做中华的守护者
- 探讨Android6.0及以上系统APP常驻内存(保活)实现-复活篇
- mybatis 学习笔记
- USACO-section1.5 Superprime Rib[深搜]
- Java基础笔记之一
- flex布局完全入门教程
- Neutron 默认安全组规则