广搜算法详解C++版.docx
《广搜算法详解C++版.docx》由会员分享,可在线阅读,更多相关《广搜算法详解C++版.docx(16页珍藏版)》请在冰豆网上搜索。
广搜算法详解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列)。
数据范围:
00〈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;ja[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------------------