题解 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;//结束
}

感谢观看

posted @ 2020-08-07 11:44  DSHUAIB  阅读(84)  评论(0)    收藏  举报