大佬们觉得哪里还可以优化
查看原帖
大佬们觉得哪里还可以优化
621493
qzldm楼主2022/10/9 22:24
#include<iostream>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<cstring>
using namespace std;
int n, m,startx,starty,arr[301][301][4],ans,siz;
//n为x轴,m为y轴,startx和starty用于记录起点,arr用于记录四个方向是否走过,ans为答案,siz记录每一步的扩展
int dx[4] = { -1,0,1,0 };//dx和dy用于四个方向的前进
int dy[4] = { 0,1,0,-1 };
queue<pair<int, int>>road;//用于广搜道路
map<char, pair<int, int>>tran;//暂时存储传送点
map<pair<int, int>, pair<int, int>>transfussion;//存储传送点
char maze[301][301];//记录地图
void input();//输入函数,方便我调试
int bfs(pair<int, int>dot,int floor)
{
	if (maze[dot.first][dot.second] == '=')
		return ans;
	for (int i = 0; i <4; i++)
	{
		int tempx = dot.first+dx[i];
		int tempy = dot.second+dy[i];
		if ( maze[tempx][tempy] != '#' && arr[tempx][tempy][i] == -1)
		{
			if (maze[tempx][tempy] >= 'A' && maze[tempx][tempy]<='Z')
			{
				int a = transfussion[make_pair(tempx, tempy)].first;//确认传送的位置
				int b = transfussion[make_pair(tempx, tempy)].second;
				arr[tempx][tempy][i] = ans;
				road.push(make_pair(a, b));
			}
			else 
			{
				arr[tempx][tempy][i] = ans;
				road.push(make_pair(tempx, tempy));
			}
		}
	}
	if (floor != 0)
		return 0;
	while(road.size()!=0)
	{
		
		if (siz == 0)
		{
			siz = road.size();
			ans++;
		}
		int t=bfs(road.front(), floor + 1);
		if (t != 0)
			return ans;
		siz--;
		road.pop();
	}
	return ans;
}
int main()
{
	freopen("title.in", "r", stdin);
	input();
	memset(arr, -1, sizeof(arr));
	cout<<bfs(make_pair(startx, starty), 0);
	return 0;
}
void input()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int t = 0; t < m; t++)
		{
			cin >> maze[i][t];
			if (maze[i][t] <='Z' && maze[i][t] >='A')
			{
				//map的插入是不可以覆盖的
				bool temp = tran.insert(make_pair(maze[i][t], make_pair(i, t))).second;
				int temp1 = tran[maze[i][t]].first;
				int temp2 = tran[maze[i][t]].second;
				if (!temp)
				{
					transfussion.insert(make_pair(make_pair(i, t), make_pair(temp1, temp2)));
					transfussion.insert(make_pair(make_pair(temp1, temp2), make_pair(i, t)));
				}
			}
			else if (maze[i][t] == '@')
			{
				startx = i;
				starty = t;
			}
		}
	}
}

比别人用多了一半多的时间

2022/10/9 22:24
加载中...