搜索篇

搜索篇主要介绍深搜、广搜、剪枝和A*算法,下面通过具体的题目进行一一呈现。

Q1(Problem source : 百练2815):

描述

请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成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

  分析:很典型的dfs问题,数据规模不大也不会用到剪枝,这里需要注意的一个运算符优先级的小细节是用位运算符&和==运算符的时候,前面的位运算符要加小括号。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 51;
int Map[maxn][maxn];
int visit[maxn][maxn];
int m , n;
int dfs(int i , int j)
{
     int num = 1;
     visit[i][j] = 1;
     if((Map[i][j] & 1) == 0 && j - 1 >= 1 && visit[i][j-1] == 0)
     {
          num += dfs(i,j-1);
     }
     if((Map[i][j] & 2) == 0 && i - 1 >= 1 && visit[i-1][j] == 0)
     {
          num += dfs(i-1,j);
     }
     if((Map[i][j] & 4) == 0 && j + 1 <= n && visit[i][j+1] == 0)
     {
          num += dfs(i,j+1);
     }
     if((Map[i][j] & 8) == 0 && i + 1 <= m && visit[i+1][j] == 0)
     {
          num += dfs(i+1,j);
     }

     return num;
}
int main()
{

      while(scanf("%d",&m) != EOF)
      {
           scanf("%d",&n);
            for(int i = 1;i <= m;i++)
                  for(int j = 1;j <= n;j++)
                      scanf("%d",&Map[i][j]);

            memset(visit , 0 , sizeof(visit));

            int num = 0;
            int Max = 0;
           // printf("%d ",dfs(1,1));

            for(int i = 1;i <= m;i++)
                  for(int j = 1;j <= n;j++)
                  {
                        if(visit[i][j] == 0)
                        {

                            num++;
                            Max = max(Max , dfs(i,j));
                        }
                         else  continue;
                 }

            printf("%d\n%d\n",num,Max);

      }
}
时间: 2024-10-08 13:12:05

搜索篇的相关文章

【转载】Lucene.Net无障碍学习和使用:搜索篇

在上一篇中,我们初步理解了索引的增删改查基本操作.本文着重介绍一下常用的搜索,以及搜索结果的排序和分页.本文的搜索主要是基于前一篇介绍的文本文件的索引,建议下载最后改进的demo对照着看阅读本文,同时大家可以自己动手创建一些测试文本,然后建立索引并搜索试试看. 一.初步认识搜索 先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 private TopDocs Searc

Jan&#39;s light oj 01--二分搜索篇

碰到的一般题型:1.准确值二分查找,或者三分查找(类似二次函数的模型). 2.与计算几何相结合答案精度要求比较高的二分查找,有时与圆有关系时需要用到反三角函数利用 角度解题. 3.不好直接求解的一类计数问题,利用二分直接枚举可能的结果,再检查是否符合题目要求. 4.区间求解,即利用两次二分分别查找有序序列左右上下限,再求差算出总个数. 题型知识补充: 1. 三分的一般写法: 1 double thfind(double left,double right) 2 { 3 double midmid

《新浪微博自动评论软件&#183;设计与实现之关键字搜索篇》

任务:进行关键字搜索,对结果批量评论 通过GET请求来获取搜索页面,其url:http://s.weibo.com/weibo/keyword&Refer=STopic_box.其中keyword为搜索关键字. 利用Python的RegEx解析网页,获取每条微博的mid. 手动对一条微博发送评论,抓取其数据包,分析其中各个参数及其作用以便在程序中对其进行更改模拟,其中包括但不限于Cookie字段以及POST参数mid.content. 利用Python编写程序模拟3中的情况重新提交POST请求,

Elasticsearch 数据搜索篇&#183;【入门级干货】

ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的特性. 其他相关的内容参考:Elasticsearch官方文档翻译 样例数据 为了更好的使用和理解ES,没有点样例数据还是不好模拟的.这里提供了一份官网上的数据,accounts.json.如果需要的话,也可以去这个网址玩玩,它可以帮助你自定义写随机的JSON数据. 首先开启你的ES,然后执行下面的

Lucene.Net无障碍学习和使用:搜索篇

一.初步认识搜索 先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现: private TopDocs Search(string keyword,string field) { TopDocs docs = null; int n = 10;//最多返回多少个结果 SetOutput(string.Format("正在检索关键字:{0}", keyword)); try { QueryParser parser = new QueryParser(field, new Stand

Elasticsearch 数据搜索篇&#183;【入门级干货】===转

ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的特性. 其他相关的内容参考:Elasticsearch官方文档翻译 样例数据 为了更好的使用和理解ES,没有点样例数据还是不好模拟的.这里提供了一份官网上的数据,accounts.json.如果需要的话,也可以去这个网址玩玩,它可以帮助你自定义写随机的JSON数据. 首先开启你的ES,然后执行下面的

新浪微博数据挖掘菜谱之三: 搜索篇 (selenium)

#!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-12-30 @author: beyondzhou @name: decode_search_entities.py ''' # Decode entities from search result def decode_search_entities(): # import from search import weibo_search from entities imp

【微信公众平台开发】封装获取天气预报功能

微信公众平台小功能多点,可以增加用户的粘性,不会感觉你微信没内容,就把你给取消关注了.所以得折腾各种有的没的东西. 个人封装天气预报功能代码如下(说明下:网上有很多此类代码,但是要自己理解,就得实际折腾) <?php header('Content-Type:text/html;charset=utf-8'); class WeChatMsgType { private $toUserName; private $fromUserName; private $xmlModle; private

剪枝的定义&amp;&amp;hdu1010

半年前在POJ上遇到过一次剪枝的题目,那时觉得剪枝好神秘...今天在网上查了半天资料,终于还是摸索到了一点知识,但是相关资料并不多,在我看来,剪枝是技巧,而不是方法,也就是说,可能一点实用的小技巧,让程序可以少判断一点,这就是剪枝,剪枝无处不在, 搜索的进程可以看作是从树根出发,遍历一棵倒置的树—-搜索树的过程.而所谓的剪枝,顾名思义,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是减去了搜索树中的某些“枝条”,故称剪枝.(杭电课件上是这么说的:即剪去解答树上已被证明不可能存在可行解或