搜索8--noi1817:城堡问题
搜索8--noi1817:城堡问题
一、心得
1、这题只是在普通的迷宫的基础上面加上了墙的概念,所以基本的思路和代码就和普通的迷宫是一样的,只不过需要多加上一层墙的判断
2、这里墙的判断是用的二进制加上位运算的方法
二、题目
1817:城堡问题
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
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)的北墙。输入的数据保证城堡至少有两个房间。
- 输出
- 城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。
- 样例输入
-
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 - 来源
- 1164
三、分析
1、这题是DFS而非回溯
2、因为1表示西墙,2表示北墙,4表示东墙,8表示南墙。如果castle[i][j]&1==1;说明西边有墙不能走
四、AC代码
/*
* 1817:城堡问题
* 分析:
*
* 1、这题是DFS而非回溯
* 2、因为1表示西墙,2表示北墙,4表示东墙,8表示南墙。如果castle[i][j]&1==1;说明西边有墙不能走
*
*/ #include <iostream>
using namespace std;
int southNorth, westEast;
int castle[][];
int vis[][];
int roomNum;
int roomSize;
int maxRoomSize=;
//1表示西墙,2表示北墙,4表示东墙,8表示南墙
int goSouthNorth[]={,-,,};
int goWestEast[]={-,,,}; void init() {
//1、读数据
cin >> southNorth >> westEast;
for (int i = ; i <= southNorth; i++) {
for (int j = ; j <= westEast; j++) {
cin >> castle[i][j];
vis[i][j]=false;
}
}
//2、变量初始化
roomNum=; } void print() {
cout<< southNorth <<" "<< westEast<<endl;
for (int i = ; i <= southNorth; i++) {
for (int j = ; j <= westEast; j++) {
cout<< castle[i][j]<<" ";
}
cout<<endl;
}
} void printAns(){
cout<<roomNum<<endl<<maxRoomSize<<endl;
}
//把一个房间所有能访问的格子都给它访问了
void searchAll(int startH,int startW){
for(int i=;i<;i++){
//b1为true说明有墙,不能走
bool b1=(<<i)&castle[startH][startW];
if(!b1){//如果没墙能走
int h1=startH+goSouthNorth[i];
int w1=startW+goWestEast[i];
//b2是不越界
bool b2= h1>=&&h1<=southNorth&&w1>=&&w1<=westEast;
if(b2&&!vis[h1][w1]){//如果不越界并且没有被访问过
vis[h1][w1]=true;
roomSize++;
if(roomSize>maxRoomSize) maxRoomSize=roomSize;
searchAll(h1,w1);
}
}
}
} void search(){
for (int i = ; i <= southNorth; i++) {
for (int j = ; j <= westEast; j++) {
roomSize=;
if(!vis[i][j]){
vis[i][j]=true;
roomNum++;
roomSize++;
//cout<<"roomNum:"<<"i="<<i<<" j="<<j<<endl;
searchAll(i,j);
}
}
}
} int main() {
//freopen("1817in.txt","r",stdin);
init();
//print();
search();
printAns();
return ;
}
五、注意点
搜索8--noi1817:城堡问题的更多相关文章
- 深度优先搜索(dfs),城堡问题
题目链接:http://poj.org/problem?id=1164 1.深搜,每个点都访问一次,没有标记的话,就做深搜,同时标记. #include <iostream> #inclu ...
- 深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)
将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...
- [USACO Section 2.1]城堡 The Castle (搜索)
题目链接 Solution 比较恶心的搜索,思路很简单,直接广搜找联通块即可. 但是细节很多,要注意的地方很多.所以直接看代码吧... Code #include<bits/stdc++.h&g ...
- hdu 1269 迷宫城堡 强连通分量
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 迷宫城堡--HDOJ 1269
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdoj 1269 迷宫城堡【scc基础题目】
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDOJ迷宫城堡(判断强连通 tarjan算法)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU 1269 迷宫城堡(DFS)
迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...
- 胜利大逃亡,bfs,广度优先搜索
题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius ...
随机推荐
- BaseServlet 介绍
1. BaseServlet 的作用 让一个Servlet可以处理多种不同的请求,不同的请求调用Servlet的不同方法. 2. 实现原理 客户端发送请求时, 必须多给出一个参数, 用来说明要调用的方 ...
- MySQL中的DDL,DML
MySQL中的DDL,DMLDDL:数据定义语言: CREATE,ALTER,DROP DB组件:数据库.表.索引.视图.用户.存储过程.存储函数.触发器.事件调度器等 CR ...
- 深入理解MVC架构
MVC MVC是一种设计模式(Design pattern),也就是一种解决问题的方法和思路, 是上世纪80年代提出的,到现在已经颇有历史了. MVC的意义在于指导开发者将数据与表现解耦,提高代码,特 ...
- OSI参考模型与排错
OSI参考模型中底层为其上层服务,因此排除网络故障应该也从底层到高层依次排查. 首先检查网络连接是否正常(物理层检查).例如网卡没有接好网线,将会看到带红叉的本地连接,属于物理层故障. 连接好网卡后, ...
- Python进阶(1)_Socket网络编程(基于tcp的socket)
网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...
- Android 结束进程的方法forceStopPackage
ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); Method method = Clas ...
- iOS WKWebView OC 与 JS 交互学习
我写WKWebView 想让 服务端相应 一个 方法但是不响应,根据 UIWebView 用 JSContext就能拿到响应的处理经验是不是服务端 也需要 对 WKwebView有兼容的一个写法??? ...
- 《Effective MySQL之SQL语句最优化》读书笔记——乱七八糟系列(给自己看)
该书区别于诸如<MySQL技术内幕——InnoDB存储引擎>等书的一大特色是该书主要讲的是MySQL数据库中的索引技术,并分别讲了InnoDB.MyISAM.Memory三个存储引擎.其中 ...
- Ag-grid控件使用pine:left后,配合iview下拉框,会出现闪烁
Ag-grid控件使用pinned:left后,配合iview下拉框,会出现闪烁 引起原因:下拉图标的反转动画 目前解决方案: 添加一个全局样式: 禁用动画,其他地方也是如此, 影响控件有:gz-tr ...
- [RK3288][Android6.0] USB OTG模式及切换【转】
本文转载自:https://blog.csdn.net/kris_fei/article/details/78620960 Platform: RK3288 OS: Android 6.0 Kerne ...