bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx

上传人:b****2 文档编号:14562307 上传时间:2022-10-23 格式:DOCX 页数:5 大小:15.09KB
下载 相关 举报
bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx_第1页
第1页 / 共5页
bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx_第2页
第2页 / 共5页
bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx_第3页
第3页 / 共5页
bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx_第4页
第4页 / 共5页
bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx

《bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx(5页珍藏版)》请在冰豆网上搜索。

bfs解决宝葫芦问题解题报告+广搜(bfs)算法Word格式文档下载.docx

=m-1),p是弹簧的能量。

在下面的两行里,分别是你和宝葫芦的坐标。

此外,你在空中经过的弹簧对

你没有任何影响。

已知你、宝葫芦和弹簧的初始位置都不同。

x坐标轴的范围是1到n,y坐标轴的范围是1到m。

有多组测试用例。

输出:

最少的步数,或者impossible

题目来源:

bit网络教室

解题思路:

首先明确这是一个搜索问题,并且不需要记录路径,那么就不需要要用深搜(dfs),并且深搜需要搜索完所有的点才能却确定出最小的解,这个代价是

很大的,所以应该选择广搜(bfs)。

在搜索的时候,建立队列,把人的起点都放在队列的开始,然后从它开始搜索,搜都的点放在队列里,然后从队列里取值搜

索,直到到搜到宝葫芦为止,最少的步数就是搜索的层数,若果搜索完队列里的所有元素,还没有找到宝葫芦,那么就是impossible。

需要注意的细节:

1)当你跳到弹簧的时候,一定要把此次弹簧跳的终点存在队列里,而不是把弹簧的坐标存在队列里面。

2)弹簧可能被用多次,跳过之后不要删

附上代码,仅供参考:

*/

#include<

stdio.h>

math.h>

#defineN105

intn,m,flag;

intfront,rear;

intspring[N][N],map[N][N],pp[N*N];

///spring[][]弹簧,map[][]标记是否搜过,0-还没碰过,1-看到了,2-搜过了;

pp[]该点至少跳几次才到

structpoint

{

intx;

inty;

};

structpointend,p[N*N];

voidfindlast(int&

p1,int&

p2,intfang1,intfang2)//如果遇到弹簧,那么需要找到最终的落点

inta=p1,b=p2;

p1+=fang1*spring[a][b];

p2+=fang2*spring[a][b];

if(p1<

=0)

{

p1=1;

return;

}

if(p1>

n)

p1=n;

if(p2<

p2=1;

return;

if(p2>

m)

p2=m;

if(spring[p1][p2]==0)

elsefindlast(p1,p2,fang1,fang2);

}intsearch(inta,intb)

if(a==end.x&

&

b==end.y)

return1;

else

inttag=pp[front]+1;

///tag无其他还以,只是pp[front]+1需要用很多次,为了简便,下同

if(b-1>

0&

map[a][b-1]==0)

{

if(spring[a][b-1]>

0)////判断是否有弹簧,下同

{

intp1=a,p2=b-1;

findlast(p1,p2,0,-1);

////找到最终的落点,最终的落点就是要存在队列里的点,0,-1,表示此时搜索方向,下同

if(map[p1][p2]==0)

{

p[rear].x=p1;

p[rear].y=p2;

pp[rear++]=tag;

map[p1][p2]=1;

}

}

else

p[rear].x=a;

p[rear].y=b-1;

map[a][b-1]=1;

}

if(a-1>

map[a-1][b]==0)

if(spring[a-1][b]>

0)

intp1=a-1,p2=b;

findlast(p1,p2,-1,0);

p[rear].x=a-1;

p[rear].y=b;

map[a-1][b]=1;

if(a+1<

=n&

map[a+1][b]==0)

if(spring[a+1][b]>

intp1=a+1,p2=b;

findlast(p1,p2,1,0);

++rear;

p[rear].x=a+1;

map[a+1][b]=1;

if(b+1<

=m&

map[a][b+1]==0)

if(spring[a][b+1]>

intp1=a,p2=b+1;

findlast(p1,p2,0,1);

p[rear].y=b+1;

map[a][b+1]=1;

}

return0;

intmain()

intk,i,j;

while(scanf("

%d%d%d"

&

n,&

m,&

k)!

=EOF)

for(i=1;

i<

=n;

++i)

{

for(j=1;

j<

=m;

++j)

spring[i][j]=0;

map[i][j]=0;

while(k--)

scanf("

%d%d"

i,&

j);

///输入弹簧坐标

%d"

spring[i][j]);

///输入该弹簧能量

front=0;

rear=1;

scanf("

%d%d%d%d"

p[front].x,&

p[front].y,&

end.x,&

end.y);

///输入起点和终点,即是你的位置和宝葫芦的位置

pp[front]=0;

while(front<

rear)

if(search(p[front].x,p[front].y))

break;

front++;

if(front==rear)

printf("

impossible\n"

);

else

%d\n"

pp[front]);

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1