广搜算法详解C++版Word文档格式.docx
《广搜算法详解C++版Word文档格式.docx》由会员分享,可在线阅读,更多相关《广搜算法详解C++版Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
如果走不到,则输出NoAnswer!
样例输入
55
11111
11100
10001
00100
11101
41
54
样例输出
6
#include<
cstdio>
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)
%d"
map[i][j]);
intx1,x2,y1,y2;
x1,&
y1);
x2,&
y2);
l=0;
r=1;
line[1].x=x1;
line[1].y=y1;
v[x1][y1]=true;
while(l<
r)
{
++l;
inttex,tey;
for(inti=0;
4;
tex=line[l].x+xx[i];
tey=line[l].y+yy[i];
if(tex>
0&
&
tex<
=n&
tey>
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("
line[r].len);
return0;
}
}
NoAnswer!
"
);
}
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
程序代码
cstdlib>
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++)
{
tx=q[st].x+fx[i];
ty=q[st].y+fy[i];
if(tx>
=0&
tx<
n&
ty>
ty<
a[tx][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()
while(m!
=0)
m--;
tf=false;
scanf("
n);
n;
scanf("
%s"
a[i]);
for(intj=0;
j++)
if(a[i][j]=='
s'
){sx=i;
sy=j;
a[i][j]='
e'
){ex=i;
ey=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
1001000001
17
102
14
参考程序:
#include<
iostream>
cstring>
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>
x<
y<
a[x][y]==0)returntrue;
elsereturnfalse;
intx,y,t=1,w=1;
cin>
>
x>
xx>
yy;
a[x][y]=1;
dl[t].x=x;
dl[t].y=y;
dl[t].step=0;
if(pr(x,y))
{cout<
<
dl[t].step<
endl;
return;
while(t<
=w)
for(inti=0;
{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<
dl[w].step<
return;
t++;
chars[1001];
for(inti=1;
s);
for(intj=0;
a[i][j+1]=s[j]-'
0'
bfs();
//system("
pause"
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------------------