题解 P1825 【[USACO11OPEN]玉米田迷宫Corn Maze】
这道题就是一道简单的搜索题,用广搜就可以做出来,如果没有传送门,就往四个方向走,如果遇到传送门,就直接传送到另一个传送门,但是还有一些比较坑的点。
例如
###=##
#....#
###A##
#@...#
######
#A...#
######
就要经过两次传送门
知道了这个,这到题就比较简单了
代码如下
#include<iostream>
#include<queue>
using namespace std;
char square[305][305];//定义一个数组存迷宫
bool aim[305][305];//标记数组
int dx[4]={0,0,1,-1},n;
int dy[4]={1,-1,0,0},m;//四个方向及迷宫大小
struct sta
{
int x,y,t;
}temp;//每一个点的位置及步数
queue <sta> ans;//队列
void sea(int x,int y)
{
for(int i=1;i<=n;i++)
{
for(int k=1;k<=m;k++)
{
if(square[i][k]==square[x][y]&&(i!=x||k!=y))
{
temp.x=i,temp.y=k;//找到另一个传送门,并将其存入temp里
return;
}
}
}
}
int main()
{
int x,y;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int k=1;k<=m;k++)
{
cin>>square[i][k];
if(square[i][k]=='@')
x=i,y=k;//找到起点
}
}
temp.x=x,temp.y=y,temp.t=0;
aim[x][y]=1;
ans.push(temp);//将起点存入队列
while(!ans.empty())//如果队列不为空
{
if(square[ans.front().x][ans.front().y]=='=')
{
cout<<ans.front().t;//到达终点,结束程序
return 0;
}
int x1,y1;
for(int i=0;i<4;i++)//往四个方向扩展
{
x1=ans.front().x+dx[i],y1=ans.front().y+dy[i];
if(x1<1||y1<1||x1>n||y1>m||aim[x1][y1]||square[x1][y1]=='#')//若不满足条件,则跳过
continue;
aim[x1][y1]=1;//将此点标记为已走
if(square[x1][y1]>='A'&&square[x1][y1]<='Z')//如果为传送门
{
sea(x1,y1);//找到另一个传送门
temp.t=ans.front().t+1;//步数加一
ans.push(temp); //存入队列
}
else//如果不是传送门,正常行走
{
temp.x=x1,temp.y=y1,temp.t=ans.front().t+1;
ans.push(temp);
}
}
ans.pop();//取出对头
}
return 0;//结束
}
感谢观看

浙公网安备 33010602011771号