搜索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. 使用国内源(brew, pip, npm)

    如果网络不行,安装依赖包的速度小于 100k/s 或者丢包严重导致安装很慢,我认为就应该使用国内源了.今天因为国内源的问题弄了很久,我觉得在国内服务器部署,全部应该从国内下载资源.分为两种情况, 存在 ...

  2. Starting Session of user root.

    Sep 23 01:50:01 d systemd: Started Session 1475 of user root.Sep 23 01:50:01 d systemd: Starting Ses ...

  3. Bean\Entity\Model\POJO\Dto\EJB简单解析

    一.Bean 对于Bean而言,只要是Java的类的就可以称为一个Bean, 更用在Spring上,被Spring管理的对象就可以将其称作为Bean. 它不仅仅可以包括对象的属性以及get,set方法 ...

  4. python requests 使用

    快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其假设你已经安装了 Requests.如果还没有,去安装一节看看吧. 首先,确认一下: Requests 已安装 Req ...

  5. 找出n的阶乘末尾有几个零

    原理:因为10由2*5组成,而构成2的因数比5多 所以最终转换成求5的个数 int getNumber(int n) { int count = 0; while(n) { n = n/5; coun ...

  6. boost之字符串与文本处理

    C++标准库中字符串转数值使用函数atoi(),数值转字符串使用printf系列函数. boost中使用转换函数操作符lexical_cast<>进行转换,实际上是模板函数.自定义类型,要 ...

  7. loadrunder之脚本篇——int类型和字符串的相互转换

    字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345");  //将字符串变为整形 lr_output_message(" ...

  8. OJ 1101 谁是中间的那个

    前言:主要考察排序用法 sort(cow+1,cow+1+n,cmp);//数组按cmp方法排序 Description 一天,农夫乔伊像往常一样来到了他的牧场,他突然对他的奶牛产奶量产生了兴趣.他想 ...

  9. openGL学习进程(1)OpenGL的简介

        通过本节,我们来简要了解一下openGL.     (1)OpenGL概述: openGL(Open Graphics Library)是个专业的图形程序接口,定义了一个跨编程语言.跨平台的编 ...

  10. arcgis for flex map遮罩

    效果1:map的遮罩(对整个map进行遮罩) 效果2:对某个图层进行遮罩