BFS HDOJ 1242 Rescue

 

题目传送门

题意:从r走到a,遇到x多走一步,问最小走到a的步数

分析:因为r有多个,反过来想从a走到某个r的最小步数,简单的BFS。我对这题有特殊的感情,去年刚来集训队时肉鸽推荐了这题,当时什么都不会,看个数组模拟队列的BFS看的头晕,现在看起来也不过如此,额,当年开始是从r走到a的,因为数据巨弱才过的,应该要用到优先队列。

/************************************************
* Author        :Running_Time
* Created Time  :2015/9/25 星期五 09:13:51
* File Name     :B_BFS.cpp************************************************/#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 2e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
struct Angle    {int x, y, step;Angle () {}Angle (int x, int y, int step) : x (x), y (y), step (step) {}
};
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
bool vis[N][N];
char maze[N][N];
int n, m;bool judge(int x, int y)    {if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || maze[x][y] == '#') return false;else    return true;
}void BFS(Angle s)    {int ret = INF;memset (vis, false, sizeof (vis));queue<Angle> Q; Q.push (s);vis[s.x][s.y] = true;while (!Q.empty ()) {Angle r = Q.front ();   Q.pop ();for (int i=0; i<4; ++i) {int tx = r.x + dx[i];int ty = r.y + dy[i];if (!judge (tx, ty))  continue;vis[tx][ty] = true;if (maze[tx][ty] == 'r')    {ret = min (ret, r.step + 1);    continue;}else if (maze[tx][ty] == 'x')   {Q.push (Angle (tx, ty, r.step + 2));    continue;}else    Q.push (Angle (tx, ty, r.step + 1));}}if (ret == INF) puts ("Poor ANGEL has to stay in the prison all his life.");else    printf ("%d\n", ret);
}int main(void)   {while (scanf ("%d%d", &n, &m) == 2) {for (int i=1; i<=n; ++i)    {scanf ("%s", maze[i] + 1);}bool find = false;  Angle start;for (int i=1; i<=n && !find; ++i)    {for (int j=1; j<=m; ++j)    {if (maze[i][j] == 'a')  {start = Angle (i, j, 0);find = true;    break;}}}BFS (start);}return 0;
}

 

当年的代码不忍直视。。。

#include<stdio.h>
typedef struct point
{int x,y,step;
}target;
int N,M,dir[4][2]={0,1,0,-1,1,0,-1,0},ax,ay;
int flag[202][202];
char map[302][302];
target que[40005];
int BFS(target start)
{int end,top,i;int min=1000000;target in,next;end=top=0;que[top]=start;while (top>=end){in=que[end];end=(end+1);for (i=0;i<4;i++){next.x=in.x+dir[i][0];next.y=in.y+dir[i][1];if (map[next.x][next.y]=='r'){if (min>in.step+1)min=in.step+1;}if (next.x>=0&&next.x<N&&next.y>=0&&next.y<M&&map[next.x][next.y]!='#'){if (flag[next.x][next.y]>in.step+1){next.step=in.step+1;if (map[next.x][next.y]=='x')next.step++;flag[next.x][next.y]=next.step;top=(top+1);que[top]=next;}}}}if (min!=1000000)return min;elsereturn -1;
}
int main()
{int i,j,num;target start;while (scanf("%d%d",&N,&M)!=EOF){for (i=0;i<N;i++){scanf("%s",map[i]);for (j=0;j<M;j++){flag[i][j]=1000000;if (map[i][j]=='a'){//map[i][j]='.';ax=i;ay=j;}}}start.x=ax;start.y=ay;start.step=0;//map[ax][ay]='.';num=BFS(start);if (num==-1)printf("Poor ANGEL has to stay in the prison all his life.\n");elseprintf("%d\n",num);}return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4837255.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql insert 不需要日志_详解MySQL|你不知道的新特性-8.0错误日志增强

MySQL 8.0 重新定义了错误日志输出和过滤&#xff0c;改善了原来臃肿并且可读性很差的错误日志。比如增加了 JSON 输出&#xff0c;在原来的日志后面以序号以及 JSON 后缀的方式展示。比如我机器上的 MySQL 以 JSON 保存的错误日志 mysqld.log.00.json&#xff1a;[rootcentos-…

idea中java文件怎么运行_Java入门基础篇-如何在Java中创建只读文件

本文选自千锋教育《Java语言程序设计》&#xff0c;如需转载请注明出处&#xff0c;谢谢&#xff01;1、如何创建只读文件要使文件只读&#xff0c;我们只要将文件属性更改为只读就行&#xff1b;可以使用File类的setReadOnly()方法来实现。它会返回一个布尔值&#xff0c;这样…

模仿JavaAppArguments.java示例

要求&#xff1a;编写一个程序&#xff0c;此程序从命令行接受多个数字&#xff0c;求和之后输出结果。 设计思想&#xff1a;命令行的参数都是字符串&#xff0c;需要定义一个整形数组将其转化为整数&#xff0c;然后实现数字的相加&#xff0c;最后输出结果。 程序流程图&…

showdoc windows 搭建_ShowDoc的搭建

其实&#xff0c;官方文档也说的很清楚了。主要贴一下我遇见的问题。环境&#xff1a;LNMP(LAMP没试过&#xff0c;有兴趣的同学可以试试&#xff0c;然后发出来)PHP5.3以上版本、php-mbstring模块、php-pdo模块、mysql数据库克隆或者下载代码&#xff1a;https://github.com/s…

2020年408真题_自考书院:2020年10月00830现代语言学真题

免费发布2020年10月全国统一命题《00830现代语言学》试卷其他真题&#xff1a;甘肃自考网 >> 历年试题 >>http://www.gseea.net点击历年真题查看更多真题和复习资料【互动交流平台】&#xff1a;交流QQ一群&#xff1a;35167222交流QQ二群&#xff1a;251822544自考…

linux优先级队列,Python3 线程优先级队列( Queue)

导读Python 的 Queue 模块中提供了同步的、线程安全的队列类&#xff0c;包括FIFO(先入先出)队列Queue&#xff0c;LIFO(后入先出)队列LifoQueue&#xff0c;和优先级队列 PriorityQueue。这些队列都实现了锁原语&#xff0c;能够在多线程中直接使用&#xff0c;可以使用队列来…

泛泰A860(高通公司8064 cpu 1080p) 拂4.4中国民营recovery TWRP2.7.1.2文本(通过刷第三版)...

专业第三方开发团队 VegaDevTeam &#xff08;本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo crazyi(天下无雪) windxixi(雪狐) wangsai008 组成&#xff09; 说说中文TWRP的简史: 中文TWRP是本人在2012.10月在原英文TWRP的基础上首次改…

linux重启memcache_Linux下的Memcache安装方法

Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端&#xff0c;目前的最新版本是 memcached-1.3.0 。下载&#xff1a;http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz另外&#xff0c;Memcache用到了libevent这个库用于Socket的处理&#xff0c;…

电脑机箱cad图纸_如何批量打印高清黑白CAD图纸?这么好用的方法现在才知道

工作中为了更方便查看和传阅CAD图纸&#xff0c;经常要将CAD图纸打印出来&#xff0c;有时候要打印很多张&#xff0c;而且还不是最终定稿&#xff01;如果打印成彩印也太浪费墨水了&#xff01;所以批量打印黑白图纸的技巧就显得十分重要啦&#xff01;很多小伙伴们都不知道怎…

c语言链表编程作业,C语言编程入门——链表

链表是为克服数组的缺点&#xff0c;在内存空间中离散存储&#xff0c;但需要一个指针记住下一个结点的地址&#xff0c;以便可以将链表结点连接起来。链表与数组的比较&#xff1a;数组优点&#xff1a;存取速度快。缺点&#xff1a;插入和删除元素的效率很低&#xff1b;需要…

Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP

D. Painting The WallUser ainta decided to paint a wall. The wall consists of n2 tiles, that are arranged in an n  n table. Some tiles are painted, and the others are not. As he wants to paint it beautifully, he will follow the rules below. Firstly user a…

ahp层次分析法_基于层次分析法(AHP)的店铺选址应用研究

导读在连锁行业&#xff0c;店铺选址是其中很重要的一个方面。影响店铺选址的指标(因素)很多&#xff0c;决策中经常需要对店铺影响各指标进行量化分析。本文应用层级分析法(AHP)&#xff0c;对影响店铺选址的指标(因素)权重进行量化分析&#xff0c;以帮助决策者从备选的多个店…

html页面刷新回到顶部_页面刷新后,使页面自动滚回到顶部

比如有一个页面&#xff0c;滚动条在body上&#xff0c;当页面滚动到下方时&#xff0c;如何在刷新后使页面滚动回初始位置&#xff1f;已尝试但是失效的方案&#xff1a;$("body").scrollTop(0);window.scrollTo(0,0);document.body.scrollTop0;除了页面跳转&#x…

当c语言表达式中同时有字符 整数,c语言第2章数据类型、运算符与表达式a.ppt

c语言第2章数据类型、运算符与表达式aC语言程序设计;本章主要学习任务;2.1 C的数据类型;注意&#xff1a;C语言中的数据有变量与常量&#xff0c;它们分别属于上述这些类型。;2.2 常量与变量;不是C语句&#xff0c;不必在行末加分号。该命令是用标识符代替一个字符串&#xff0…

构造函数和clone以及在继承中

构造函数 类实例的构造创建过程是: 1.属性域被初始化为默认值(0,false,null) 2.按照在类声明的顺序初始化初始化语句和初始化块. 3.执行构造函数 所以,一个默认的空的无参构造函数并没有初始化类的实例域.因为实例域先于构造而初始化完毕了.构造函数无法被继承如果一个类没有定…

python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...

鬼畜小姐姐野狼disco&#xff0c;十分钟教你如何用Python剪辑一个牛逼的抖音小视频&#xff1f;前言半个月前&#xff0c;后台有个小伙伴问我&#xff0c;如何将视频中的音频提取出来&#xff0c;并且将声音转成文字写入到 word 中&#xff0c;正好接下来的文章要用到百度的语音…

web无序列表去掉点_无序列表排序之方法

利用jQuery对无序列表排序的原理是&#xff1a;获取到无序列表中的所有列表项&#xff0c;并转成数组形式&#xff0c;使用JavaScript函数对其进行排序后再次输出。其中使用到的jQuery函数有ready()、get()、text()、each()、append()和JavaScript函数sort()。1&#xff0e;jQu…

c语言编程怎么实现替换,使用C语言实现字符串中子字符串的替换

描述&#xff1a;编写一个字符串替换函数&#xff0c;如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace)&#xff0c;strSrc为原字符串&#xff0c;strFind是待替换的字符串&#xff0c;strReplace为替换字符串。举个直观的例子吧&#xff0c;如&#xff…

数据结构:点之间的最短距离--Floyd算法

Floyd算法 Floyd算法 Dijkstra算法是用于解决单源最短路径问题的&#xff0c;Floyd算法则是解决点对之间最短路径问题的。Floyd算法的设计策略是动态规划&#xff0c;而Dijkstra採取的是贪心策略。当然&#xff0c;贪心算法就是动态规划的特例。 算法思想 点对之间的最短路径仅…

shell 获取家目录_一篇教会你写90%的shell脚本

shell是外壳的意思&#xff0c;就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统&#xff0c;比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说&#xff0c;Shell是一个命令解释器&#xff0c;它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行…