SPFA40分求助
查看原帖
SPFA40分求助
701221
Chr0n1CleC楼主2022/7/25 21:46

没有TLE,代码如下:

#include<stdio.h>
#include<queue>
using namespace std;

char a[1209][1209];

int dis[1209][1209];

bool vis[1209][1209];

struct node
{
int x, y;	
};

queue < node > q;

int pA[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

int pB[4][2] = {{2, 0}, {-2, 0}, {0, 2}, {0, -2}};

int pC[4][2] = {{1, 1}, {-1, 1}, {-1, -1}, {1, -1}};

inline void SPFA(int n, int sx, int sy)
{
	for (int i = 1;i <= n;i ++)
		for (int j = 1;j <= n;j ++)
			dis[i][j] = 1e9, vis[sx][sy] = 0;
	dis[sx][sy] = 1;
	vis[sx][sy] = 1;
	if (a[sx][sy] != '*')
		q.push((node){sx, sy});
	while (q.size())
	{
		int x = q.front().x, y = q.front().y;
		vis[x][y] = 0;
		q.pop();
		for (int i = 0;i < 4;i ++)
		{
			int nx, ny;
			if (a[x][y] == 'A')
				nx = pA[i][0] + x, ny = pA[i][1] + y;
			if (a[x][y] == 'B')
				nx = pB[i][0] + x, ny = pB[i][1] + y;
			if (a[x][y] == 'C')
				nx = pC[i][0] + x, ny = pC[i][1] + y;
			if (a[nx][ny] != '*' && nx >= 1 && nx <= n && ny >= 1 && ny <= n)
			{
				if (a[x][y] != 'C' && dis[nx][ny] > dis[x][y] + 1)
				{
					dis[nx][ny] = dis[x][y] + 1;
					if (!vis[nx][ny])
						q.push((node){nx, ny}), vis[nx][ny] = 1;
				}
				if (a[x][y] == 'C' && dis[nx][ny] > dis[x][y] + 1)
				{
					dis[nx][ny] = dis[x][y] + 1;
					if (!vis[nx][ny])
						q.push((node){nx, ny}), vis[nx][ny] = 1;
				}
			}
		}
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1;i <= n;i ++)
		scanf("%s", a[i] + 1);
	SPFA(n, 1, 1);
	int ans = dis[n][n];
	SPFA(n, 1, n);
	if (dis[n][n] < ans)
		ans = dis[n][n];
	SPFA(n, n, 1);
	if (dis[n][n] < ans)
		ans = dis[n][n];
	if (dis[n][n] != 1e9)
		printf("%d", dis[n][n]);
	else
		printf("No answer");
	
	return 0;
}
2022/7/25 21:46
加载中...