A与A星算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

只是用一个二维状态数组,结果迂回搜索导致超时.

/showproblem.php?pid=4198

Quick out of the Harbour

Problem Description

题目原文是英文的,而且比较繁琐。我修饰转述如下:

小强被海盗抓到了,海盗把他和他的船“小强号”关在一个水狱里。

小强拿到了小红给他的一张水狱地图,地图由h行w列字符组成(3 <= h;w <= 500), ,字符共有四种:

S:小强和他的“小强号”的起始位置,他要从这里逃跑。

#:不能逾越的石墙

. :水道,小强号可以直接通过

@:栅栏水道

已知:

小强打开栅栏需要d分钟 (0 <= d <= 50);

小强号通过单位水道的时间为1分钟;

水狱一定有出口。

输入:

t (一共有t组测试数据)

h w d 以及水狱地图 (每组测试数据输入一次)

输出:

小强出狱的最短时间(和路线)。

Sample Input

2

6 5 7

#####

#S..#

#@#.#

#...#

#@###

#.###

4 5 3

#####

#S#.#

#@..#

###@#

Sample Output

16

11

分析:

从S点开始,广度优先搜索,寻找出口。

由于有栅栏,不能保证搜索的当前结点是“耗时最少”的优先搜索,对当前结点耗时v取权重,采用优先队列。code:(普通广度搜索,超时)

#include

#include

using namespace std;

#define N 501

#define big 999999999

int h,w,d,sx,sy,t,i,j;

int tv[N][N];

char maze[N][N];

int offset[4][2]={{-1,0},{0,-1},{1,0},{0,1}};

struct pos

{int x;int y;};

int bfs()

{

int mymin=big;

pos start,temp,temp1;

start.x=sx,start.y=sy;

tv[sx][sy]=0;

queue q;

q.push(start);

while(!q.empty())

{

temp=q.front();

q.pop();

if(temp.x==0||temp.x==h-1||temp.y==0||temp.y==w-1)

if(mymin>tv[temp.x][temp.y]+1)

mymin=tv[temp.x][temp.y]+1;

printf("path: %d %d %c\n",temp.x,temp.y,maze[temp.x][temp.y]);

for(i=0;i<4;i++)

{

pos temp1;

temp1.x=temp.x+offset[i][0];

temp1.y=temp.y+offset[i][1];

if(temp1.x<0||temp1.x>=h||temp1.y<0||temp1.y>=w)

continue;

if(maze[temp1.x][temp1.y]=='.')

if(tv[temp1.x][temp1.y]>tv[temp.x][temp.y]+1)

{

tv[temp1.x][temp1.y]=tv[temp.x][temp.y]+1;

q.push(temp1);

}

if(maze[temp1.x][temp1.y]=='@')

if(tv[temp1.x][temp1.y]>tv[temp.x][temp.y]+d+1)

{tv[temp1.x][temp1.y]=tv[temp.x][temp.y]+1+d;q.push(tem p1);}

}

}

return mymin;

}

int main()

{

cin>>t;

while(t--)

{

cin>>h>>w>>d;

getchar();

for(i=0;i

{

for(j=0;j

{

scanf("%c",&maze[i][j]);//cin>>maze[i][j];

tv[i][j]=big;

if(maze[i][j]=='S')

{sx=i;sy=j;}

}

getchar();

}

printf("%d\n",bfs());//cout<

}

}

code:改用优先队列,以到达该结点的时间v为权重,每次使v最小的结点出队,即所谓“A算法”

#include

#include

using namespace std;

#define N 501

int h,w,d,sx,sy,t,i,j;

bool used[N][N];

char maze[N][N];

相关文档
最新文档