hdu 1547 搜索题

先说下题意:

给你个地图     里面有a-z的颜色泡      为你一个点    若与这个点连着的颜色相同超过3个  则会爆炸     之后没有雨最顶端相连(间接相连也行)的也会爆炸 给你个坐标  问你会爆炸多少个      先深搜(或广搜)找到多少个  会爆炸    大于三个在对第一行的所有点进行广搜找到所有相连的点   用总的减去就行

做了这道题明白一个道理   题目的图不是没用的,,   为此还贡献了几次wa           这道题做起来比较容易  就是得先搞清楚球是交叉排的     这就涉及到一个是否连着的问题    对基数行和偶数行是不一样的,    所以方向数组是不一样的 ,,   这道题的具体做法有很多 广搜深搜都行    这里就不多说了

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;

int n,m;
char map[110][110],p;
int dirou[6][2]={0,1,0,-1,1,0,-1,0,1,-1,-1,-1};
int dirji[6][2]={0,1,0,-1,1,0,-1,0,-1,1,1,1};
int sum,mark[110][110];
struct node
{
    int x,y;
}a,b,leap[10010];
int dfs(int x,int y)
{
    int xx,yy;
    for(int i=0;i<6;i++)
    {
        if(x%2==0)
        {
            xx=x+dirou[i][0];
            yy=y+dirou[i][1];
            if(xx<0||xx>=n||yy<0) continue;
            if(xx%2==0&&yy>=m) continue;
            if(xx%2!=0&&yy>=m-1) continue;
        }
        else
        {
            xx=x+dirji[i][0];
            yy=y+dirji[i][1];
            if(xx<0||xx>=n||yy<0) continue;
            if(xx%2==0&&yy>=m) continue;
            if(xx%2!=0&&yy>=m-1) continue;
        }
        if(map[xx][yy]!=p) continue;
        if(mark[xx][yy]==0)
        {
            sum++;
            mark[xx][yy]=1;
            leap[sum].x=xx;
            leap[sum].y=yy;
            dfs(xx,yy);
        }
    }
    return 0;
}
int bfs(int starx,int stary)
{
    a.x=starx;
    a.y=stary;
    queue<node>q;
    int t=1;
    mark[a.x][a.y]=1;
    q.push(a);
    while(!q.empty())
    {
        b=q.front();
        q.pop();
        for(int i=0;i<6;i++)
        {
            if(b.x%2==0)
            {
                a.x=b.x+dirou[i][0];
                a.y=b.y+dirou[i][1];
                if(a.x<0||a.x>=n||a.y<0) continue;
                if(a.x%2==0&&a.y>=m) continue;
                if(a.x%2!=0&&a.y>=m-1) continue;
            }
            else
            {
                a.x=b.x+dirji[i][0];
                a.y=b.y+dirji[i][1];
                if(a.x<0||a.x>=n||a.y<0) continue;
                if(a.x%2==0&&a.y>=m) continue;
                if(a.x%2!=0&&a.y>=m-1) continue;
            }
            if(mark[a.x][a.y]) continue;
            if(map[a.x][a.y]>=‘a‘&&map[a.x][a.y]<=‘z‘)
            {
                mark[a.x][a.y]=1;
                t++;
                //printf("****\n");
                q.push(a);
            }
        }
    }
    return t;
}
int main()
{
    int i,j,starx,stary;
    while(~scanf("%d%d%d%d",&n,&m,&starx,&stary))
    {
        for(i=0;i<n;i++)
        scanf("%s",map[i]);
        starx--;
        stary--;
        sum=1;
        leap[sum].x=starx;
        leap[sum].y=stary;
        p=map[starx][stary];
        memset(mark,0,sizeof(mark));
        mark[starx][stary]=1;
        dfs(starx,stary);
        if(sum<3) printf("0\n");
        else
        {    //printf("%d^^^^^\n",sum);
            for(i=1;i<=sum;i++)
            map[leap[i].x][leap[i].y]=‘E‘;
            int num=0;
            for(i=0;i<n;i++)
            {
                int k=(i%2==0?m:m-1);
                for(j=0;j<k;j++)
                if(map[i][j]>=‘a‘&&map[i][j]<=‘z‘) num++;
            }
            memset(mark,0,sizeof(mark));
            int kk=0;
            for(j=0;j<m;j++)
            {
                if(mark[0][j]==1) continue;
                if(map[0][j]==‘E‘) continue;
                kk+=bfs(0,j);
            }
            printf("%d\n",sum+num-kk);
        }
    }
    return 0;
}
时间: 2024-11-10 13:01:26

hdu 1547 搜索题的相关文章

hdu&amp;&amp;poj搜索题题号

搜索 hdu1067 哈希 hdu1401 双向搜索 hdu1430 哈希 hdu1667 跌搜+启发式函数 hdu1685 启发式搜索 hdu1813 启发式搜索 hdu1885 状态压缩搜索 hdu2918 哈希 hdu2931 dfs+dfs hdu2977 bfs+dfs hdu3004 车马炮 hdu3085 双向bfs hdu3900 哈希 hdu4012 状态压缩搜索 hdu4634 状态压缩搜索 poj1324 状态压缩 poj2044 状态压缩 poj3131 双向搜索 poj

hdu 1254(搜索题)

推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7062    Accepted Submission(s): 2009 Problem Description 推 箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工 只能推箱子而不能拉箱

50道hdu基础搜索总结(转)

Dfs: 大部分是直接递归枚举,即求满足约束条件下的解,虽不用剪枝,但也需要代码能力. 练习递归枚举的题目: 1241       Oil Deposits (dfs的连通块个数) 1016       Prime Ring Problem 1584       蜘蛛牌(简单dfs,简单的剪枝,还有人用DP做(???)) 1426       Sudoku Killer(练习递归的好题目 or Dancing links(???)) 2510       符号三角形(打表题,写写打表程序还是不错

搜索题推荐

(转自网络博客): POJ POJ 1376 – Robot(基础) http://acm.pku.edu.cn/JudgeOnline/problem?id=1376 题意:略 解法:bfs,A*-. POJ 2688 – Cleaning Robot(基础) http://acm.pku.edu.cn/JudgeOnline/problem?id=2688 题意:bfs后转换为tsp问题 解法:bfs+dp,bfs+dfs 相关:http://hi.baidu.com/zfy0701/blo

ACM 暴力搜索题 题目整理

UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include

经典搜索题

今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id=1011 刚开始接触搜索的初学者面对这道题可能感觉无从下手,即便是告诉了要用深搜解决这道题,也不知道怎么用,我现在也对搜索有了更多的理解与体会,其实不要把搜索只理解为在一个地图上找点,其实搜索更可以抽象为当面对多个选择的时候如何抉择,深搜就是先认准一个方向走下去,不行再回来,走别的路:广搜就是把每

关于10月12日#2的四道搜索题的心得与感悟

今天上午开始写姜神的搜索题. 第一道,经典八数码,重新复习康托展开与BFS.代码写得太弱,外加对题理解不充分,调了一上午的码. 第二题,八数码变种,数据更水,把握住翻转的扩展规律即可. 第三题,还在施工 第四题,一开始DFS暴力,TLE掉;后来开始用DFS记忆化搜索,失败;接着尝试BFS+DP,TLE掉.最后在网上看了题解,利用DP解决. 在DP的过程中要留意边界.另外状态转移的时候很容易写出模模糊糊的错误转移.在这题中,先处理好一排或一列,在逐层或逐列转移,可以避免重复计算导致的超时. 第四题

历年NOIP中的搜索题

什么题目都不会做于是开始做搜索题. 然而我搜索题也不会做了. 铁定没戏的蒟蒻. 1.NOIP2004 虫食算 “对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立.输入数据保证有且仅有一组解”. 大概就是给你一堆(n个)字母让你求出n进制下的一个n位数加n位数得到n位数的唯一解(允许有前导0). 千算万算没算到最大的优化是从大到小枚举数字 反正顶多26位,个位开始爆搜2333. 几个比较重要的剪枝: 当前列不可能满足立即退出. 一列三个数,知二推一. 当前答案与之前冲

hdu 5887 搜索+剪枝

Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 687    Accepted Submission(s): 145 Problem Description Collecting one's own plants for use as herbal medicines is perhaps one of t