博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1242 Rescue
阅读量:5157 次
发布时间:2019-06-13

本文共 3123 字,大约阅读时间需要 10 分钟。

bfs问题。

Angel有被关在监狱,她有非常多朋友要去救她。

#表示墙,.表示路,x表示警卫,r表示她的朋友。

因为可能有非常多朋友,可是Angel仅仅有一个,所以搜索起点设为Angel。仅仅要找到一个朋友表示能走出去。

走一格须要1,杀死警卫须要1,假设使用 queue 不能直接加2.

由于会出现这样的情况

4 8axxxxxxr........................

假设直接加2的话,答案就不是9.

可是使用 priority_queue 就能够无视这样的情况了。我也要開始习惯使用priority_queue。

queue版本号。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x7fffffff#define eps 1e-8#define LL long long#define PI 3.141592654#define CLR(a,b) memset(a,b,sizeof(a))#define FOR(i,a,n) for(int i= a;i< n ;i++)#define debug puts("==fuck==")#define acfun std::ios::sync_with_stdio(false)#define SIZE 1000+10using namespace std;int xx[]={0,0,-1,1};int yy[]={-1,1,0,0};int n,m;char g[201][201];struct lx{ int x,y,lv; void init(int xx,int yy,int llv) { x=xx,y=yy,lv=llv; }};lx start,thend;void bfs(){ queue
q; bool vis[201][201]; CLR(vis,0); q.push(start); vis[start.x][start.y]=1; while(!q.empty()) { lx tmp=q.front(); q.pop();// printf("%d %d == %d\n",tmp.x,tmp.y,tmp.lv);// system("pause"); if(g[tmp.x][tmp.y]=='r') { printf("%d\n",tmp.lv); return ; } FOR(k,0,4) { int x=tmp.x+xx[k]; int y=tmp.y+yy[k]; if(x<0||y<0||x>=n||y>=m||g[x][y]=='#'||vis[x][y]) continue; lx now; if(g[x][y]=='x') { now.init(tmp.x,tmp.y,tmp.lv+1); g[x][y]='.'; } else { now.init(x,y,tmp.lv+1); vis[x][y]=1; } q.push(now); } } puts("Poor ANGEL has to stay in the prison all his life.");}int main(){ while(~scanf("%d%d",&n,&m)) { char str[201]; FOR(i,0,n) { scanf("%s",str); FOR(j,0,m) { g[i][j]=str[j]; if(g[i][j]=='a') start.init(i,j,0); } } bfs(); }}

priority_queue 版本号

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x7fffffff#define eps 1e-8#define LL long long#define PI 3.141592654#define CLR(a,b) memset(a,b,sizeof(a))#define FOR(i,a,n) for(int i= a;i< n ;i++)#define debug puts("==fuck==")#define acfun std::ios::sync_with_stdio(false)#define SIZE 200+10using namespace std;int xx[]={0,0,-1,1};int yy[]={-1,1,0,0};int n,m;char g[SIZE][SIZE];struct lx{ int x,y,lv; void init(int xx,int yy,int llv) { x=xx,y=yy,lv=llv; } friend bool operator< (lx a,lx b) { return a.lv>b.lv; }};lx start;void bfs(){ priority_queue
q; bool vis[SIZE][SIZE]; CLR(vis,0); vis[start.x][start.y]=1; q.push(start); while(!q.empty()) { lx tmp=q.top(); q.pop(); if(g[tmp.x][tmp.y]=='r') { printf("%d\n",tmp.lv); return ; } FOR(k,0,4) { int x=tmp.x+xx[k]; int y=tmp.y+yy[k]; if(x<0||y<0||x>=n||y>=m||vis[x][y]||g[x][y]=='#') continue; lx now; if(g[x][y]=='x') now.init(x,y,tmp.lv+2); else now.init(x,y,tmp.lv+1); vis[x][y]=1; q.push(now); } } puts("Poor ANGEL has to stay in the prison all his life.");}int main(){ while(~scanf("%d%d",&n,&m)) { char str[SIZE]; FOR(i,0,n) { scanf("%s",str); FOR(j,0,m) { g[i][j]=str[j]; if(g[i][j]=='a') start.init(i,j,0); } } bfs(); }}

转载于:https://www.cnblogs.com/mengfanrong/p/4388480.html

你可能感兴趣的文章
前端面试题一
查看>>
不同程序语言的注释和变量要求
查看>>
Timer 的使用
查看>>
转载-做一个双向自豪的人
查看>>
转-由12306.cn谈谈网站性能技术
查看>>
<Effective C++>读书摘要--Implementations<二>
查看>>
redis学习基本命令
查看>>
语言基础(9):static, extern 和 inline
查看>>
windows linux—unix 跨平台通信集成控制系统
查看>>
【编程练习】复习一下树的遍历
查看>>
邮件和短信验证码
查看>>
(转)Android studio 使用心得(五)—代码混淆和破解apk
查看>>
构建之法阅读笔记03
查看>>
ES5_03_Object扩展
查看>>
Apache-ab 接口性能测试
查看>>
EF 4.1 Code First Walkthrough
查看>>
常用MySQL语法
查看>>
007API网关服务Zuul
查看>>
bzoj 2600: [Ioi2011]ricehub
查看>>
iOS __strong __weak @Strongify @Weakify
查看>>