题目:[宽度优先搜索BFS]魔兽世界(Standard IO)
题目描述
小A是一个小术士,他很喜欢单挑boss,单挑boss是指在一个n*m的矩形(1<=n,m<=100),上面铺满了小怪和传送门,其中1表示有小怪,0表示没有小怪,大写字母表示传送门,传送门是一对相同的大写字母,如遇到一个大写字母A则马上可以到达另一个大写字母A的位置(次数不限,但每次进入传送点只传送过去,不会再传送回来,数据保证每个传送门有且仅有相对应的另一个传送门).小A的出发点在左上方的(1,1)出发,boss躲在右下方的(n,m).小A决不会再小怪身上浪费时间(当然是绕开它们),并且想用最快的时间到达boss的位置.
输入
第1行两个整数n和m
下面的n行,每行m个字符(入口点和boss点无小怪和传送门),表示地图。地图数据之间无空格。每步只能走一格,方向只能是上,下,左,右。左上角为出发点,右下角为目标点。
输出
如果小A可以找到boss,则输出最少的步数,否则输出“No Solution.”。
样例输入
输入样例1:
3 4
0000
00A0
A000
样例输入2:
4 6
010100
01A100
011101
0000A0
样例输出
输出样例1:
4
样例输出2:
10
Cake 1#
c++
#include<bits/stdc++.h>
using namespace std;
char a[100+10][100+10];
int n,m,w,b[100+10][100+10],fx[5+10][5+10]={{0,1},{1,0},{-1,0},{0,-1}},xa=0,ya=0;
struct node
{
int x,y,t;
}d[10000+10];
void five(int x,int y)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(a[i][j]==a[x][y]&&(i!=x||j!=y))
xa=i,ya=j;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>a[i][j];
d[1]={1,1,0};
int q=1,p=2;
while(q<p)
{
int x=d[q].x,y=d[q].y,t=d[q].t;
q++;
for(int i=0;i<4;++i)
{
int xx=x+fx[i][0];
int yy=y+fx[i][1];
if(xx<1||yy<1||xx>n||yy>m||a[xx][yy]=='1'||b[xx][yy]==1)
continue;
b[xx][yy]=1;
if(a[xx][yy]!='0')
{
five(xx,yy);
xx=xa,yy=ya;
}
d[p++]={xx,yy,t+1};
if(xx==n&&yy==m)
{
cout<<t+1;
return 0;
}
}
}
cout<<"No Solution.";
}
Cake 2#
c++
#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
char t;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int ms[110][110];
int v[110][110];
int ax[100001];
int ay[100001];
int sum[100001];
bool flag;
int ans;
void bfs()
{
int head=0;
int tail=1;
ax[tail]=1;
ay[tail]=1;
sum[tail]=0;
do
{
head++;
for(int i=0;i<4;i++)
{
int nx=ax[head]+dx[i];
int ny=ay[head]+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&ms[nx][ny]==0&&v[nx][ny]==0)
{
tail++;
ax[tail]=nx;
ay[tail]=ny;
sum[tail]=sum[head]+1;
// ms[nx][ny]=-1;
v[nx][ny]=1;
if(nx==n&&ny==m)
{
printf("%d",sum[tail]);
flag=true;
head=tail;
break;
}
}
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&ms[nx][ny]>=1&&ms[nx][ny]<=26&&v[nx][ny]==0)
{
tail++;
int nx1,ny1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(ms[i][j]==ms[nx][ny]&&(nx!=i||ny!=j))
{
nx1=i;
ny1=j;
break;
}
}
}
ax[tail]=nx1;
ay[tail]=ny1;
sum[tail]=sum[head]+1;
// ms[nx][ny]=-1;
v[nx][ny]=1;
// ms[nx1][ny1]=-1;
if(nx1==n&&ny1==m)
{
printf("%d",sum[tail]);
flag=true;
head=tail;
break;
}
}
}
}while(head<tail);
}
int main()
{
scanf("%d%d\n",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>t;
if(t=='1')
{
ms[i][j]=-1;
}
if(t=='0')
{
ms[i][j]=0;
}
if(t>='A'&&t<='Z')
{
ms[i][j]=t-64;
}
}
scanf("%c",&t);
}
ms[1][1]=-1;
v[1][1]=1;
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// printf("%d ",ms[i][j]);
// }
// printf("\n");
// }
bfs();
if(!flag)
{
printf("No Solution.");
}
return 0;
}
Cake 3#
Pascal
const fx:array[1..4,1..2] of longint=((-1,0),(1,0),(0,-1),(0,1));
var
b:array['A'..'Z',1..2] of longint;
c:array[0..100,0..100,1..2] of longint;
bz:array[0..100,0..100] of longint;
d:array[0..10000,1..3] of longint;
ch:char;
n,m,i,j,st,en,xx,yy,xxx,yyy:longint;
begin
readln(n,m);fillchar(bz,sizeof(bz),$1f);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(ch);
if ch in ['A'..'Z'] then
if (b[ch,1]=0) and (b[ch,2]=0) then
begin
b[ch,1]:=i;
b[ch,2]:=j;
end
else
begin
c[i,j,1]:=b[ch,1];
c[i,j,2]:=b[ch,2];
c[b[ch,1],b[ch,2],1]:=i;
c[b[ch,1],b[ch,2],2]:=j;
end;
if ch='1' then bz[i,j]:=-1;
end;
readln;
end;
st:=0;en:=1;d[1,1]:=1;d[1,2]:=1;d[1,3]:=0;
while st<en do
begin
inc(st);
for i:=1 to 4 do
begin
xx:=d[st,1]+fx[i,1];
yy:=d[st,2]+fx[i,2];
if (xx>0) and (xx<=n) and (yy>0) and (yy<=m) then
begin
if (c[xx,yy,1]<>0) and (c[xx,yy,2]<>0) then
begin
xxx:=xx;
yyy:=yy;
xx:=c[xxx,yyy,1];
yy:=c[xxx,yyy,2];
end;
if d[st,3]+1<bz[xx,yy] then
begin
inc(en);
d[en,1]:=xx;
d[en,2]:=yy;
d[en,3]:=d[st,3]+1;
bz[xx,yy]:=d[en,3];
end;
if (xx=n) and (yy=m) then
begin
writeln(d[en,3]);
exit;
end;
end;
end;
end;
writeln('No Solution.');
end.