广搜算法详解C++版.docx

上传人:b****0 文档编号:517088 上传时间:2022-10-10 格式:DOCX 页数:16 大小:20.43KB
下载 相关 举报
广搜算法详解C++版.docx_第1页
第1页 / 共16页
广搜算法详解C++版.docx_第2页
第2页 / 共16页
广搜算法详解C++版.docx_第3页
第3页 / 共16页
广搜算法详解C++版.docx_第4页
第4页 / 共16页
广搜算法详解C++版.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

广搜算法详解C++版.docx

《广搜算法详解C++版.docx》由会员分享,可在线阅读,更多相关《广搜算法详解C++版.docx(16页珍藏版)》请在冰豆网上搜索。

广搜算法详解C++版.docx

广搜算法详解C++版

搜索算法

1、校园迷宫(RQNOJ195)

题目描述

总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。

不知转了多少次车,总算到了。

可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。

鄙人就开始研究地图了,但是学校错综复杂,等找到目的地,早就开考了。

为此,鄙人取出随身携带的微型电脑(不知道从哪来的),向网上发去了求助书。

注:

只能往4个方向走:

上、下、左、右。

输入格式

第1行,二个数,N,M。

接下来是一个N*M的矩阵,表示这个学校。

(有N行,M列)。

矩阵由2个数字组成。

0:

路;1:

墙。

路能走,墙不能走(这是基本常识。

不过还是提醒一下,不然哪个牛又要飞檐走壁了)。

再是2行,第1行2个数X1,Y1表示校门口的坐标(即校门口在矩阵的第X1行,第Y1列)。

第2行2个数X2,Y2表示鄙人的考场的坐标(即校门口在矩阵的第X2行,第Y2列)。

数据范围:

0

0〈X1,X2〈=N,0〈Y1,Y2〈=M。

输出格式

一个数,表示最少要走的步数。

如果走不到,则输出NoAnswer!

样例输入

55

11111

11100

10001

00100

11101

41

54

样例输出

6

#include

intxx[4]={1,-1,0,0};

intyy[4]={0,0,1,-1};

structss

{

intx,y,len;

}line[2000001];

intl,r,n,m,ans;

intmap[2001][2001];

boolv[2001][2001];

intmain()

{

scanf("%d%d",&n,&m);

for(inti=1;i<=n;++i)

for(intj=1;j<=m;++j)

scanf("%d",&map[i][j]);

intx1,x2,y1,y2;

scanf("%d%d",&x1,&y1);

scanf("%d%d",&x2,&y2);

l=0;

r=1;

line[1].x=x1;

line[1].y=y1;

v[x1][y1]=true;

while(l

{

++l;

inttex,tey;

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

{

tex=line[l].x+xx[i];

tey=line[l].y+yy[i];

if(tex>0&&tex<=n&&tey>0&&tey<=m)

if((map[tex][tey]==0)&&(!

v[tex][tey]))

{

++r;

line[r].x=tex;

line[r].y=tey;

line[r].len=line[l].len+1;

v[tex][tey]=1;

if(tex==x2&&tey==y2)

{

printf("%d",line[r].len);

return0;

}

}

}

}

printf("NoAnswer!

");

return0;

}

2、迷宫(CODEVS1215)

题目描述Description

在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。

从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。

输入描述InputDescription

输入的第一行为一个整数m,表示迷宫的数量。

其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。

输出描述OutputDescription

输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。

样例输入SampleInput

1

7

s...##.

.#.....

.......

..#....

..#...#

###...#

......e

样例输出SampleOutput

YES

程序代码

#include

#include

intm,n;

chara[20][20];

intsx,sy,ex,ey;

booltf;

intfx[4]={-1,0,0,1};

intfy[4]={0,-1,1,0};

structnode{intx,y,d;};

nodeq[400];

intst,ed;

voidbfs()

{

q[1].x=sx;q[1].y=sy;q[1].d=0;

st=1;ed=2;

while(st!

=ed)

{

inttx,ty;

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

{

tx=q[st].x+fx[i];

ty=q[st].y+fy[i];

if(tx>=0&&tx=0&&ty

{

if(tx==ex&&ty==ey)

{

tf=true;

return;

}

q[ed].x=tx;

q[ed].y=ty;

q[ed].d=q[st].d+1;

a[tx][ty]='#';

ed++;

}

}

st++;

}

}

intmain()

{

scanf("%d",&m);

while(m!

=0)

{

m--;tf=false;

scanf("%d",&n);

for(inti=0;i

{

scanf("%s",a[i]);

for(intj=0;j

{

if(a[i][j]=='s'){sx=i;sy=j;a[i][j]='.';}

if(a[i][j]=='e'){ex=i;ey=j;a[i][j]='.';}

}

}

bfs();

if(tf==true)printf("YES\n");

elseprintf("NO\n");

}

}

3、紧急援救(RQNOJ34)

题目描述

话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送装置,我们终于确定了他的位置,必须赶快到那里去救他。

根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到Mike博士最短距离。

数据范围:

n<=1000

输入格式

第一行为n

第二行为n*n的地图(其中0表示通路,1表示死路)

最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。

输出格式

一个数字k,表示从研究所出发找到Milk博士的最短距离。

样例输入

10

010*******

0001110010

1000000001

1000100011

0000101100

1000001100

1001010011

0000010100

010*******

1001000001

17

102

样例输出

14

参考程序:

#include

#include

#include

usingnamespacestd;

intn;

inta[1001][1001];

intxp[4]={0,0,-1,1},yp[4]={1,-1,0,0};

intxx,yy;

structdata{

intx,y,step;

}dl[1000000];

intpr(intx,inty)

{

if(x==xx&&y==yy)return1;

elsereturn0;

}

intpd(intx,inty)

{

if(x>=1&&y>=1&&x<=n&&y<=n&&a[x][y]==0)returntrue;

elsereturnfalse;

}

voidbfs()

{

intx,y,t=1,w=1;

cin>>x>>y>>xx>>yy;

a[x][y]=1;

dl[t].x=x;dl[t].y=y;dl[t].step=0;

if(pr(x,y))

{cout<

while(t<=w)

{

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

{x=dl[t].x+xp[i];y=dl[t].y+yp[i];

if(pd(x,y))

{

a[x][y]=1;

w++;

dl[w].x=x;dl[w].y=y;dl[w].step=dl[t].step+1;

if(pr(x,y)){cout<

}

}

t++;

}

}

intmain()

{

cin>>n;

chars[1001];

for(inti=1;i<=n;i++)

{

scanf("%s",s);

for(intj=0;j

a[i][j+1]=s[j]-'0';

}

bfs();

//system("pause");

return0;

}

4、武士风度的牛(codevs1411)

农民John有很多牛,他想交易其中一头被Don称为TheKnight的牛。

这头牛有一个独一无二的超能力,在农场里像Knight一样地跳(就是我们熟悉的象棋中马的走法)。

虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个x,y的坐标图来表示。

这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了TheKnight的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。

现在你的任务是,确定TheKnight要想吃到草,至少需要跳多少次。

TheKnight的位置用'K'来标记,障碍的位置用'*'来标记,草的位置用'H'来标记。

这里有一个地图的例子:

      11|..........

      10|....*.....

      9|..........

      8|...*.*....

      7|.......*..

      6|..*..*...H

      5|*.........

      4|...*...*..

      3|.K........

      2|...*.....*

      1|..*....*..

      0------------------

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

当前位置:首页 > IT计算机

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

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