搜索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是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(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:城堡问题的更多相关文章

  1. 深度优先搜索(dfs),城堡问题

    题目链接:http://poj.org/problem?id=1164 1.深搜,每个点都访问一次,没有标记的话,就做深搜,同时标记. #include <iostream> #inclu ...

  2. 深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)

    将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...

  3. [USACO Section 2.1]城堡 The Castle (搜索)

    题目链接 Solution 比较恶心的搜索,思路很简单,直接广搜找联通块即可. 但是细节很多,要注意的地方很多.所以直接看代码吧... Code #include<bits/stdc++.h&g ...

  4. hdu 1269 迷宫城堡 强连通分量

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. 迷宫城堡--HDOJ 1269

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. hdoj 1269 迷宫城堡【scc基础题目】

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. HDOJ迷宫城堡(判断强连通 tarjan算法)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  8. HDU 1269 迷宫城堡(DFS)

    迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...

  9. 胜利大逃亡,bfs,广度优先搜索

    题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius ...

随机推荐

  1. BaseServlet 介绍

    1. BaseServlet 的作用 让一个Servlet可以处理多种不同的请求,不同的请求调用Servlet的不同方法. 2. 实现原理 客户端发送请求时, 必须多给出一个参数, 用来说明要调用的方 ...

  2. MySQL中的DDL,DML

    MySQL中的DDL,DMLDDL:数据定义语言:    CREATE,ALTER,DROP        DB组件:数据库.表.索引.视图.用户.存储过程.存储函数.触发器.事件调度器等    CR ...

  3. 深入理解MVC架构

    MVC MVC是一种设计模式(Design pattern),也就是一种解决问题的方法和思路, 是上世纪80年代提出的,到现在已经颇有历史了. MVC的意义在于指导开发者将数据与表现解耦,提高代码,特 ...

  4. OSI参考模型与排错

    OSI参考模型中底层为其上层服务,因此排除网络故障应该也从底层到高层依次排查. 首先检查网络连接是否正常(物理层检查).例如网卡没有接好网线,将会看到带红叉的本地连接,属于物理层故障. 连接好网卡后, ...

  5. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

  6. Android 结束进程的方法forceStopPackage

    ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); Method method = Clas ...

  7. iOS WKWebView OC 与 JS 交互学习

    我写WKWebView 想让 服务端相应 一个 方法但是不响应,根据 UIWebView 用 JSContext就能拿到响应的处理经验是不是服务端 也需要 对 WKwebView有兼容的一个写法??? ...

  8. 《Effective MySQL之SQL语句最优化》读书笔记——乱七八糟系列(给自己看)

    该书区别于诸如<MySQL技术内幕——InnoDB存储引擎>等书的一大特色是该书主要讲的是MySQL数据库中的索引技术,并分别讲了InnoDB.MyISAM.Memory三个存储引擎.其中 ...

  9. Ag-grid控件使用pine:left后,配合iview下拉框,会出现闪烁

    Ag-grid控件使用pinned:left后,配合iview下拉框,会出现闪烁 引起原因:下拉图标的反转动画 目前解决方案: 添加一个全局样式: 禁用动画,其他地方也是如此, 影响控件有:gz-tr ...

  10. [RK3288][Android6.0] USB OTG模式及切换【转】

    本文转载自:https://blog.csdn.net/kris_fei/article/details/78620960 Platform: RK3288 OS: Android 6.0 Kerne ...