WA32分求条,玄关
查看原帖
WA32分求条,玄关
1073879
Karl_Wan楼主2024/10/23 16:45

https://www.luogu.com.cn/record/184235263

#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int n,m,sx,sy;
char maze[305][305];
struct node
{
	int x,y,dis,transfer;
};
struct node2
{
	int x,y;
}point[100];
node2 slide[305][305];
bool vis[305][305];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
queue<node> q;
int bfs()
{
	q.push({sx,sy,0,0});
	vis[sx][sy]=1;
	while(!q.empty())
	{
		node now=q.front();
		q.pop();
//		cout<<maze[now.x][now.y]<<'\n';
		//cout<<"("<<now.x<<","<<now.y<<')'<<'\n'; 
		if(maze[now.x][now.y]=='=') return now.dis;
		//考虑正常转移
		if(1)//now.transfer==(maze[now.x][now.y]<'A'||maze[now.x][now.y]>'Z'))
		{
			for(int i=0;i<4;i++)
		    {
	    		int tx=now.x+dir[i][0];
		    	int ty=now.y+dir[i][1];
		    	//cout<<"------("<<tx<<","<<ty<<')'<<'\n'; 
		    	if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&maze[tx][ty]!='#')
		    	{
//		    		cout<<"p";
					vis[tx][ty]=1;
		    		q.push({tx,ty,now.dis+1,0});
				}
	    	}
		}
		//考虑传送门转移 
		if(now.transfer==0&&(slide[now.x][now.y].x!=0||slide[now.x][now.y].y!=0)&&!vis[slide[now.x][now.y].x][slide[now.x][now.y].y])
		{
//			cout<<"t";
			vis[slide[now.x][now.y].x][slide[now.x][now.y].y]=1;
			q.push({slide[now.x][now.y].x,slide[now.x][now.y].y,now.dis,1});
		}
	}
	return -1;
}
int main()
{
//	freopen("b.cpp","r",stdin);
//	freopen("ans","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>maze[i][j];
			if(maze[i][j]>='A'&&maze[i][j]<='Z')
			{
				if(point[maze[i][j]].x==0&&point[maze[i][j]].y==0) point[maze[i][j]]={i,j};
				else
				{
					slide[i][j]=point[maze[i][j]];
					slide[point[maze[i][j]].x][point[maze[i][j]].y]={i,j};
				}
			}
			if(maze[i][j]=='@')
			{
				sx=i;sy=j;
	    	}
		}
	}
	cout<<bfs();
	
	return 0;
}

2024/10/23 16:45
加载中...