VIJOS-P1340 拯救ice-cream(广搜+优先级队列)

题意:从s到m的最短时间。(“o"不能走,‘#’走一个花两个单位时间,‘.‘走一个花一个单位时间)

思路:广搜和优先队列。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <queue>
  5 #define MAX 30
  6 using namespace std;
  7
  8 struct pos
  9 {
 10     int x;
 11     int y;
 12     int step;
 13 };
 14
 15 bool operator<(const pos &a, const pos &b)
 16 {
 17     return a.step > b.step;
 18 }
 19
 20 pos sp, ep;
 21 char map[MAX][MAX];
 22 int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}, m, n, ti;
 23
 24 int bfs()
 25 {
 26     priority_queue<pos> q;
 27     pos temp, t;
 28     temp = sp;
 29     temp.step = 0;
 30     q.push(temp);
 31     while(!q.empty())
 32     {
 33         temp = q.top();
 34         q.pop();
 35         if(temp.step >= ti)
 36         {
 37             continue;
 38         }
 39         if(temp.x == ep.x && temp.y == ep.y && temp.step < ti)
 40         {
 41             return temp.step;
 42         }
 43         for(int i = 0; i < 4; i++)
 44         {
 45             t.x = temp.x + dir[i][0];
 46             t.y = temp.y + dir[i][1];
 47             if(t.x >= 0 && t.x < n && t.y >= 0 && t.y < m && map[t.x][t.y] != ‘o‘)
 48             {
 49                 if(map[t.x][t.y] == ‘.‘)
 50                 {
 51                     t.step = temp.step + 1;
 52                     map[t.x][t.y] = ‘o‘;
 53                     q.push(t);
 54                 }
 55                 else if(map[t.x][t.y] == ‘#‘)
 56                 {
 57                     t.step = temp.step + 2;
 58                     map[t.x][t.y] = ‘o‘;
 59                     q.push(t);
 60                 }
 61                 else if(map[t.x][t.y] == ‘m‘)
 62                 {
 63                     t.step = temp.step + 1;
 64                     map[t.x][t.y] = ‘o‘;
 65                     q.push(t);
 66                 }
 67             }
 68         }
 69     }
 70     return -1;
 71 }
 72
 73 int main()
 74 {
 75     scanf("%d%d%d", &ti, &m, &n);
 76     int ans;
 77     for(int i = 0; i < n; i++)
 78     {
 79         for(int j = 0; j < m; j++)
 80         {
 81             cin>>map[i][j];
 82             if(map[i][j] == ‘s‘)
 83             {
 84                 sp.x = i;
 85                 sp.y = j;
 86             }
 87             if(map[i][j] == ‘m‘)
 88             {
 89                 ep.x = i;
 90                 ep.y = j;
 91             }
 92         }
 93     }
 94     ans = bfs();
 95     if(ans == -1)
 96     {
 97         printf("55555\n");
 98     }
 99     else
100     {
101         printf("%d\n", ans);
102     }
103     return 0;
104 }

时间: 2024-12-07 15:48:05

VIJOS-P1340 拯救ice-cream(广搜+优先级队列)的相关文章

深搜 ,广搜,队列 nyoj 27 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

A计划 HDU杭电2102【广搜+STL队列】

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

c++ 优先级队列(priority_queue)

从网上搜优先级队列用法,都是有些乱七八糟的,有几种用法都没说,直接贴代码.实在郁闷,于是自己在此归纳归纳. 废话不多说,直入主题. 优先级队列的核心是比较函数的实现. 比较函数有两种实现方法: 1.在结构体或类外面定义一个比较结构体.  //假如有个Point结构体.则new对象的时候:priority_queue<Point,vector<Point>,cmp> pg;其中cmp是自定义比较函数 2.在结构体或类中自己重载<操作符.   //假如有个Point结构体.这种方

hdu 1242:Rescue(BFS广搜 + 优先队列)

Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 14   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Angel was caught by the MOLIGPY

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that consists of empty space

Catch That Cow(广搜)

个人心得:其实有关搜素或者地图啥的都可以用广搜,但要注意标志物不然会变得很复杂,想这题,忘记了标志,结果内存超时: 将每个动作扔入队列,但要注意如何更简便,更节省时间,空间 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and t

codevs 1225:八数码难题【双向广搜】

这里是传送门 这道题用普通BFS是可以做的,但是很明显没得过,效率太低了.效率更高的算法A*和双向广搜都可取,这写一下双向广搜的. 注意题目中的判重很重要,可以转化成九位数用hash来解决这个问题. #include <set> #include <string> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And

宽搜和广搜、

广搜与深搜的小区别 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化). 像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的.深搜就