19分求助
查看原帖
19分求助
638274
_YQY楼主2022/7/15 12:39
#include<bits/stdc++.h>
using namespace std;
const int maxn=350;
struct milk{
	int x;//横坐标 
	int y;//纵坐标 
	int s;//步数 
};
int n,m;
int ans[maxn][maxn];
char a[maxn][maxn];
bool vis[maxn][maxn];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int sx,sy;//起点xy坐标
queue<milk>Q; 
void go_to(int &nx,int &ny)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==a[nx][ny]&&(i!=nx||j!=ny))//如果a[i][j]这个点的是一个与a[nx][ny]相同的传送门,并且a[i][j]与a[nx][ny]不是同一个点
            {
                nx=i;//改变当前坐标
                ny=j;
                return ;
            }
        }
    }
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='@')//获取起点坐标
            {
                sx=i;
                sy=j;
            }
		}
	 } 
	 ans[sx][sy]=0;
	 milk temp={sx,sy};
	 Q.push(temp);
	 while(!Q.empty())
	 {
	 	milk u=Q.front();
	 	Q.pop();
	 	int ux=u.x,uy=u.y;
	 	if(a[ux][uy]=='=')
	 	{
	 		cout<<ans[ux][uy]+1;
	 		return 0;
		 }
		 if(a[ux][uy]>='A'&&a[ux][uy]<='Z')
		 	go_to(ux,uy); 
		 for(int i=0;i<3;i++)
		 {
		 	int nx=ux+dx[i];
		 	int ny=uy+dy[i];
		 	int d=ans[ux][uy];
		 	if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]!='#'&&vis[nx][ny]==0)
            {
                vis[nx][ny]=1;
                milk tmp={nx,ny};
				ans[nx][ny]=d+1;
                Q.push(tmp);
            }
            
		 }
	 }
	 return 0;
}
2022/7/15 12:39
加载中...