A与A星算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.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];