我是靠谱客的博主 合适大米,最近开发中收集的这篇文章主要介绍拯救天使 (BFS),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:

1242Rescue
复制代码

1 //这是一个比较标准的bfs,没有经过任何优化,但是思路比较清晰,容易看懂。

2 #include <iostream>

3 #include <cstdio>

4 #include <queue>

5 using namespace std;

6 //node结构体

7 typedef struct

8 {

9
int x;
 10
int y;
 11
int len;
 12 }node;
 13 //全局变量定义
 14 #define M 202
 15 char Map[M][M];//地图
 16 int mask[M][M];//访问标志
 17 queue<node> q;//队列,只在bfs中用到
 18 int bx,by,ex,ey,w,h;//起点、终点、宽、高
 19 int step[4][2] = {//四个方向
 20
//0-up
 21
0,-1,
 22
//1-right
 23
1,0,
 24
//2-down
 25
0,1,
 26
//3-left
 27
-1,0
 28 };
 29
 30 void readMap(int m,int n);//读取地图
 31 void bfs();//bfs
 32 int tryXY(int x,int y);//尝试x、y点
 33
 34 void main()
 35 {
 36
while (scanf("%d %d",&h,&w)==2)
 37 
{
 38 
readMap(h,w);
 39 
bfs();
 40
cout<<mask[ex][ey]<<endl;
 41 
}
 42 }
 43
 44 void readMap(int m,int n)//m-h,n-w
 45 {
 46
int i,j;
 47
for (i=0;i<m;i++)
 48 
{
 49
for (j=0;j<n;j++)
 50 
{
 51
cin>>Map[i][j];
 52
mask[i][j] = -1;//标志为未访问
 53
if (Map[i][j] == 'r')
 54
{//friend为起点,且化为road
 55
Map[i][j] = '.';
 56
bx = i;
by = j;
 57 
}
 58
if (Map[i][j] == 'a')
 59
{//angel为终点,且化为road
 60
Map[i][j] = '.';
 61
ex = i;
ey = j;
 62 
}
 63 
}
 64 
}
 65 }
 66
 67 void bfs()
 68 {
 69
node n,m;//m为队头,n为m衍生的测试点
 70
int i,ret;
 71
//起点
 72
m.x = bx;
 73
m.y = by;
 74
m.len = 0;//len
 75
mask[bx][by] = 0;//ask
 76
q.push(m);//push
 77
//处理
 78
while (q.size())
 79 
{
 80
//get front
 81
m = q.front();
 82 
q.pop();
 83
//test node m
 84
for (i=0 ; i<4 ; i++)
 85 
{
 86
n.x = m.x+step[i][0]; n.y = m.y+step[i][1];
n.len = m.len+1;
 87
ret = tryXY(n.x,n.y);
 88
switch(ret)
 89 
{
 90
case -1://
 91
break;
 92
case 0:
 93
case 1:
 94
n.len += ret;
 95
//如果为访问,保存花销;如果已经访问,保存花销最少。
 96
if (mask[n.x][n.y] == -1 || n.len<mask[n.x][n.y])
 97 
{
 98
mask[n.x][n.y] = n.len;//已经访问且保存的是最小花销
 99 
q.push(n);
100 
}
101
break;
102 
}
103 
}
104
105 
}
106 }
107 int tryXY(int x,int y)
108 {
109
int ret;
110
//越界或遇到墙
111
if (!(x>=0 && x<w && y>=0 && y<h) || (Map[x][y] == '#'))
112
ret = -1;
113
//road or angel
114
if (Map[x][y] == '.')
115
ret = 0;
116
//guard
117
if (Map[x][y] == 'x')
118
ret = 1;
119
return ret;
120 }
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/archive/2012/10/09/2716111.html,如需转载请自行联系原作者

最后

以上就是合适大米为你收集整理的拯救天使 (BFS)的全部内容,希望文章能够帮你解决拯救天使 (BFS)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部