【问题描述】
山山厌倦了普通的迷宫,他准备挑战奇妙的迷宫 II。迷宫 II 是由若干三角形拼成的六边形
(见样例)
,其中有些点可以通过,有些点不能通过。你需要计算从起点走到终点至少要经
过多少点(不包括起点终点)
。
【输入格式】
第一行,一个整数 n,表示地图边长
接下来若干行字符串,表示一个地图。其中.表示可以经过的点,+表示不能经过的点,s 和
t 表示起点与终点。点与点之间由一个空格隔开。一行开头有一些用来保持格式的空格(见
样例)
。数据保证只有一对 s 与 t。
【输出格式】
一行一个整数 L,表示至少要经过的点数。若无解,输出-1
【样例输入】
3
. . .
. s . .
. . + . .
. . t .
. . .
【样例输出】
2
【样例解释】
【数据范围】
100%的数据保证 n ≤ 10
这道题主要就是搜索的时候,注意要考虑情况搜六个方向。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define ll long long
#define il inline
#define db double
using namespace std;
int n;
int src[2],des[2];
int limit[45];
int t[1000045][3];
int head,tail=1;
int dist[5]={0,1,0,-1,0};
bool vis[45][45];
il void check(int x,int y,int c)
{
if(x<1||y<1||x>2*n-1||y>limit[x]||vis[x][y])
return;
vis[x][y]=1;
t[tail][0]=x;
t[tail][1]=y;
t[tail++][2]=c+1;
if(x==des[0]&&y==des[1])
{
printf("%d\n",c);
exit(0);
}
}
il void bfs()
{
t[0][0]=src[0];
t[0][1]=src[1];
vis[src[0]][src[1]]=1;
int a,b,c,x,y;
while(head!=tail)
{
a=t[head][0],b=t[head][1],c=t[head++][2];
for(int i=0;i<4;i++)
{
x=a+dist[i],y=b+dist[i+1];
check(x,y,c);
}
if(a>n)
{
x=a-1,y=b+1;
check(x,y,c);
x=a+1,y=b-1;
check(x,y,c);
}
else if(a<n)
{
x=a-1,y=b-1;
check(x,y,c);
x=a+1,y=b+1;
check(x,y,c);
}
else if(a==n)
{
x=a-1,y=b-1;
check(x,y,c);
x=a+1,y=b-1;
check(x,y,c);
}
}
}
int main()
{
freopen("maze2.in","r",stdin);
freopen("maze2.out","w",stdout);
cin>>n;
char ch;
limit[0]=n-1;
for(int i=1;i<2*n;i++)
{
if(i<=n)
limit[i]=limit[i-1]+1;
else
limit[i]=limit[i-1]-1;
for(int j=1;j<=limit[i];j++)
{
cin>>ch;
if(ch=='+')
vis[i][j]=1;
if(ch=='s')
src[0]=i,src[1]=j;
if(ch=='t')
des[0]=i,des[1]=j;
}
}
bfs();
return 0;
}