HDU1242 (BFS搜索中使用优先队列)

一道用到优先队列的BFS题目

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 201
using namespace std;
char maze[N][N];
int a,b,anw;
bool visit[N][N];
int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int sx,sy,ex,ey;
struct node{
    int x,y;
    int t;
    friend bool operator<(node n1,node n2){
        return n1.t>n2.t;
    }
};
bool judge(int x,int y)
{
    if( x<0 || y<0 || x>=a || y>=b )
        return 1;
    if( visit[x][y] )
        return 1;
    if( maze[x][y]=='#' )
        return 1;
    return 0;
}
int bfs(){
        priority_queue<node> myque;
        memset(visit,0,sizeof(visit));
        node now,next,temp;
        now.x=sx;
        now.y=sy;
        now.t=0;
        visit[sx][sy]=true;
        myque.push(now);
        while(!myque.empty()){
            temp=myque.top();
            myque.pop();
            if(maze[temp.x][temp.y]=='r') {
                return temp.t;
            }
            for(int i=0;i<4;i++){
               int nx=temp.x+dir[i][0];
               int ny=temp.y+dir[i][1];
               if(judge(nx,ny)) {
                    continue;
               }
                next.x = nx;
                next.y = ny;
               if(maze[next.x][next.y]=='x') {
                  next.t=temp.t+2;
               }
               else {
                   next.t=temp.t+1;
               }
               visit[temp.x][temp.y]=true;
               myque.push(next);
               }
        }
        return -1;
}
int main(){
        while(scanf("%d%d",&a,&b)!=EOF){
            anw=0;
            for(int i=0;i<a;i++){
                for(int j=0;j<b;j++){
                    cin>>maze[i][j];
                    if(maze[i][j]=='a') {
                        sx=i;
                        sy=j;
                    }
                }
            }
            anw=bfs();
            if(anw==-1) printf("Poor ANGEL has to stay in the prison all his life.\n");
            else printf("%d\n",anw);
        }
        return 0;
}

HDU1242 (BFS搜索中使用优先队列)

时间: 2024-08-14 23:52:47

HDU1242 (BFS搜索中使用优先队列)的相关文章

hdu 1026 Ignatius and the Princess I(bfs搜索+输出路径)

题目来源:hdu-1026 Ignatius and the Princess I Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14677 Accepted Submission(s): 4653 Special Judge Problem Description The Princ

hiho_1139_二分+bfs搜索

题目 给定N个点和M条边,从点1出发,寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径的路径中最长边长度的最小值. 题目链接:二分     最小化最大值,考虑采用二分搜索.对所有的边长进行排序,二分,对每次选择的边长,判断是否存在一条路径满足路径上所有的边长度均小于等于该边长,且路径中的边的个数小于等于K.     在判断路径是否存在的时候,使用BFS搜索,因为BFS用于寻找最短(边的个数最少)路径. 实现 #include<stdio.h> #include<string.h

Bus Pass BFS搜索

Bus Pass 题目抽象:给出nz个点组成的连通图,给出每个点的连接顶点.给出nr条路径.要求找出某点,使得到达每条路径上的每个顶点的距离的最大值最小. 分析:以每条路径上的顶点为起点,bfs搜索.具体见代码. 1 /******************************** 2 please don't hack me!! /(ToT)/~~ 3 __------__ 4 /~ ~ 5 | //^\\//^\| 6 /~~\ || T| |T|:~ 7 | |6 ||___|_|_||

hdu1181 bfs搜索之变形课

原题地址 这道题数据据说比较水,除了第一组数据是Yes以外,其余都是No,很多人抓住这点就水过了.当然了,我觉得那样过了也没什么意思.刷oj刷的是质量不是数量.这道题从题目上来看是个不错的 搜索题,解法多种多样,有 dfs,bfs,并查集,dijkstra算法都能解决. 题目分析: 题目中给了很多字符串,但是关心的只是字符串的第一个和最后一个字符.咋看起来,貌似是要建立一个个字符间的"映射",其实不然,这其实可以转化为一张26*26的有向图.有最多26个结点,原先的字符间映射关系就转化

poj 1915 Knight Moves (bfs搜索)

Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21919   Accepted: 10223 Description Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast

[原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则

[原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则 转载请注明出处:http://www.codelast.com/ line search(一维搜索,或线搜索)是最优化(Optimization)算法中的一个基础步骤/算法.它可以分为精确的一维搜索以及不精确的一维搜索两大类.在本文中,我想用“人话”解释一下不精确的一维搜索的两大准则:Armijo-Goldstein准则 & Wolfe-Powell准则.之所以这样说,是因为我读到的所有最优

【转载】关于BooleanQuery在搜索中的用处

我们在搜索中可能会遇到要搜索索引文件中不同字段,不同字段之间就存在了与或非的运算关系,如:这个xx字段中必须存在什么什么关键词,而另一个 XXX字段可以存在或不存在什么什么关键词等等等.这就需要有BooleanQuery这个得到一个组合检索对象,进行组合检索了. BooleanClause是在一个BooleanQuery中子句.该类中定义了一个静态最终内部类Occur定义了BooleanQuery的运算符: public static final Occur MUST = new Occur("

【CSWS2014 Summer School】深度问答技术及其在搜索中的应用-马艳军

Title: 深度问答技术及其在搜索中的应用 马艳军博士, 百度 Abstract: 深度问答(DeepQA)是一种基于对自然语言深度理解的智能问答技术,其核心技术涉及知识图谱建设.语义表示和计算.语义匹配等技术.深度问答在互联网尤其在搜索中有着广泛的应用价值.本课程将详细介绍深度问答中涉及的核心算法,梳理深度问答的技术脉络,并介绍其在互联网上尤其是搜索中的应用. Bio:马艳军博士现为百度公司自然语言处理部研究员,从事知识图谱.智能问答等方面的研发工作.2009年获得爱尔兰都柏林城市大学计算机

HDU 5335 Walk Out(Bfs搜索字典序最小的最短路)

 题意:nXm的地图, 问通过四个方向从(1,1)走到(1000,1000)所经过的最小二进制序列是多少,忽略前缀0. 思路:首先如果起点为0,那么我们bfs搜索和起点0联通的为0的连通块,这样我们第一步肯定是从与这个连通块相邻的且与重点最近的地方出发. 将所有可能起点加入队列,在bfs一遍找到字典序最小的那条路就是答案, 在这里可以用两个vector类型容器,一个是q2存储所有节点值存为0的结点, 另一个q3存储节点值为1的结点. 那么如果q2不为空那么也就是有可以走零,那么就从这里面选,