站外题求助AWSL
  • 板块题目总版
  • 楼主How1ver
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/1/28 11:32
  • 上次更新2023/10/28 10:39:47
查看原帖
站外题求助AWSL
510823
How1ver楼主2022/1/28 11:32

【题目描述】 去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移。这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发,到达这个装置的起点。如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。

玉米迷宫的外部完全被玉米田包围,除了唯一的一个出口。

这个迷宫可以表示为N*M的矩阵(2 <= N <= 300;2<=N<=300; 2 <= M <= 300;2<=M<=300),矩阵中的每个元素都由以下项目中的一项组成:玉米,这些格子是不可以通过的草地,可以简单的通过一个装置的结点,可以将一头奶牛传送到相对应的另一个结点出口。

奶牛仅可以在相邻两个格子之间移动,要在这两个格子不是由玉米组成的前提下才可以移动。奶牛能在一格草地上可能存在的四个相邻的格子移动。从草地移动到相邻的一个格子需要花费一个单位的时间,从装置的一个结点到另一个结点需要花费00个单位时间。

被填充为玉米的格子用'#'表示,草地用'.'表示,每一对装置的结点由相同的大写字母组成'A-Z',且没有两个不同装置的结点用同一个字母表示,出口用'='表示。

Bessie在这个迷宫中迷路了,她知道她在矩阵中的位置,将Bessie所在的那一块草地用'@'表示。求出Bessie需要移动到出口处的最短时间。 输入格式

第一行:两个用空格隔开的整数N和M;

第2至n+1行:第i+1行描述了迷宫中的第i行的情况(共有M个字符,每个字符中间没有空格。)

输出格式

一个整数,表示Bessie到达终点所需的最短时间。

#include <bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey;
char ge[305][305];
bool v[305][305];
int fx[4]={1,-1,0,0},fy[4]={0,0,-1,1};
struct chuan 
{
	bool fj;
	int ax,ay;
    int bx,by;
};
chuan c[30];
struct Node
{
    int x,y,step;
};
queue <Node> q;
int bfs()
{
	q.push({sx,sy,0});
	v[sx][sy]=true;
	while (!q.empty())
	{
		Node f=q.front();
		if (f.x==ex&&f.y==ey)
		{
			return f.step;
		}
		q.pop();
		if (ge[f.x][f.y]>='A'&&ge[f.x][f.y]<='Z')
		{
			if (c[ge[f.x][f.y]-'A'+1].ax==f.x&&c[ge[f.x][f.y]-'A'+1].ay==f.y)
			{
				q.push({c[ge[f.x][f.y]-'A'+1].bx,c[ge[f.x][f.y]-'A'+1].by,f.step});
				v[c[ge[f.x][f.y]-'A'+1].bx][c[ge[f.x][f.y]-'A'+1].by]=true;
			}
			else
			{
				q.push({c[ge[f.x][f.y]-'A'+1].ax,c[ge[f.x][f.y]-'A'+1].ay,f.step});
				v[c[ge[f.x][f.y]-'A'+1].ax][c[ge[f.x][f.y]-'A'+1].ay]=true;
			}
		}
	    for (int i=0;i<=3;i++)
	    {
	    	int tx=f.x+fx[i],ty=f.y+fy[i];
	    	if (tx<1||tx>n||ty<1||ty>m||v[tx][ty]||ge[tx][ty]=='#')
	    	{
	    		continue;
	    	}
	    	q.push({tx,ty,f.step+1});
	    	v[tx][ty]=true;
	    }
	}
	return -1;
}
int main()
{
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++)
		{
			cin>>ge[i][j];
			if (ge[i][j]=='=')
			{
				ex=i;
				ey=j;
			}
			if (ge[i][j]=='@')
			{
				sx=i;
				sy=j;
			}
			if (ge[i][j]>='A'&&ge[i][j]<='Z')
			{
				if (c[ge[i][j]-'A'+1].fj==true)
				{
					c[ge[i][j]-'A'+1].bx=i;
					c[ge[i][j]-'A'+1].by=j;
				}
				else
				{
					c[ge[i][j]-'A'+1].ax=i;
					c[ge[i][j]-'A'+1].ay=j;
					c[ge[i][j]-'A'+1].fj=true;
				}
			}
		}
	}
	cout<<bfs();
	return 0;
}QAQ

看了CSDN与百度,找错找了1天半QAQ

2022/1/28 11:32
加载中...