답안 #103309

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
103309 2019-03-29T17:53:59 Z luciocf 포탈들 (BOI14_portals) C++14
51 / 100
284 ms 896 KB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 210;

typedef pair<int, int> pii;
typedef pair<int, pii> piii;

int dist[maxn][maxn], wall[maxn][maxn];
int ox, oy, dx, dy, n, m;

bool mark[maxn][maxn];

char tab[maxn][maxn];

int linha[] = {-1, 1, 0, 0};
int coluna[] = {0, 0, -1, 1};

int find_wall(int x, int y)
{
	for (int i = 0; i <= n+1; i++)
		for (int j = 0; j <= m+1; j++)
			dist[i][j] = 1e9+10;

	memset(mark, 0, sizeof mark);

	dist[x][y] = 0, mark[x][y] = true;
	queue<pii> fila;

	fila.push({x, y});

	while (!fila.empty())
	{
		int x = fila.front().first, y = fila.front().second;
		fila.pop();

		for (int i = 0; i < 4; i++)
		{
			int a = x+linha[i], b = y+coluna[i];
			if (a < 0 || a > n+1 || b < 0 || b > m+1 || mark[a][b] || tab[a][b] == '#') continue;

			dist[a][b] = dist[x][y]+1, mark[a][b] = true;
			fila.push({a, b});
		}
	}

	int ans = 1e9+10;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (tab[i-1][j] == '#' || tab[i+1][j] == '#' ||
				tab[i][j-1] == '#' || tab[i][j+1] == '#')
				ans = min(ans, dist[i][j]+1);

	return ans;
}

void bfs(void)
{
	for (int i = 0; i <= n+1; i++)
		for (int j = 0; j <= m+1; j++)
			dist[i][j] = 1e9+10;

	dist[ox][oy] = 0;
	priority_queue<piii, vector<piii>, greater<piii>> fila;

	fila.push({0, {ox, oy}});

	while (!fila.empty())
	{
		int x = fila.top().second.first, y = fila.top().second.second;
		fila.pop();

		if (mark[x][y]) continue;

		mark[x][y] = true;

		for (int i = 0; i < 4; i++)
		{
			int a = x+linha[i], b = y+coluna[i];
			if (a < 0 || a > n+1 || b < 0 || b > m+1 || tab[a][b] == '#') continue;

			if (dist[x][y]+1 < dist[a][b])
			{
				dist[a][b] = dist[x][y]+1;
				fila.push({dist[a][b], {a, b}});
			}
		}

		for (int a = x; a >= 1; a--)
		{
			if (tab[a-1][y] != '#') continue;

			if (dist[x][y]+wall[x][y] < dist[a][y])
			{
				dist[a][y] = dist[x][y]+wall[x][y];
				fila.push({dist[a][y], {a, y}});
			}

			break;
		}

		for (int a = x; a <= n; a++)
		{
			if (tab[a+1][y] != '#') continue;

			if (dist[x][y]+wall[x][y] < dist[a][y])
			{
				dist[a][y] = dist[x][y]+wall[x][y];
				fila.push({dist[a][y], {a, y}});
			}

			break;
		}

		for (int b = y; b >= 1; b--)
		{
			if (tab[x][b-1] != '#') continue;

			if (dist[x][y]+wall[x][y] < dist[x][b])
			{
				dist[x][b] = dist[x][y]+wall[x][y];
				fila.push({dist[x][b], {x, b}});
			}

			break;
		}

		for (int b = y; b <= m; b++)
		{
			if (tab[x][b+1] != '#') continue;

			if (dist[x][y]+wall[x][y] < dist[x][b])
			{
				dist[x][b] = dist[x][y]+wall[x][y];
				fila.push({dist[x][b], {x, b}});
			}

			break;
		}
	}
}

int main(void)
{
	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			scanf(" %c", &tab[i][j]);

			if (tab[i][j] == 'S') ox = i, oy = j;
			if (tab[i][j] == 'C') dx = i, dy = j;

			wall[i][j] = 1;
		}
	}

	for (int i = 0; i <= n; i++) tab[i][0] = tab[i][m+1] = '#';
	for (int j = 0; j <= m; j++) tab[0][j] = tab[n+1][j] = '#';

	if (n > 50 || m > 50)
	{
		bfs();
		printf("%d\n", dist[dx][dy]);
		return 0;
	}

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			wall[i][j] = find_wall(i, j);

	memset(mark, 0, sizeof mark);
	bfs();

	printf("%d\n", dist[dx][dy]);
}

Compilation message

portals.cpp: In function 'int main()':
portals.cpp:146:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
portals.cpp:152:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf(" %c", &tab[i][j]);
    ~~~~~^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 3 ms 384 KB Output is correct
9 Correct 3 ms 512 KB Output is correct
10 Correct 3 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 356 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 4 ms 384 KB Output is correct
9 Correct 154 ms 504 KB Output is correct
10 Correct 168 ms 512 KB Output is correct
11 Correct 225 ms 504 KB Output is correct
12 Correct 230 ms 512 KB Output is correct
13 Correct 259 ms 512 KB Output is correct
14 Correct 2 ms 412 KB Output is correct
15 Correct 117 ms 512 KB Output is correct
16 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 3 ms 512 KB Output is correct
5 Correct 8 ms 768 KB Output is correct
6 Correct 10 ms 896 KB Output is correct
7 Correct 10 ms 768 KB Output is correct
8 Correct 6 ms 768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 4 ms 384 KB Output is correct
9 Correct 170 ms 512 KB Output is correct
10 Correct 197 ms 604 KB Output is correct
11 Correct 214 ms 500 KB Output is correct
12 Correct 224 ms 520 KB Output is correct
13 Correct 253 ms 504 KB Output is correct
14 Correct 7 ms 768 KB Output is correct
15 Correct 8 ms 768 KB Output is correct
16 Correct 10 ms 768 KB Output is correct
17 Incorrect 9 ms 768 KB Output isn't correct
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 4 ms 384 KB Output is correct
9 Correct 152 ms 508 KB Output is correct
10 Correct 172 ms 512 KB Output is correct
11 Correct 209 ms 504 KB Output is correct
12 Correct 220 ms 520 KB Output is correct
13 Correct 284 ms 504 KB Output is correct
14 Correct 7 ms 764 KB Output is correct
15 Correct 8 ms 768 KB Output is correct
16 Correct 10 ms 768 KB Output is correct
17 Incorrect 9 ms 768 KB Output isn't correct
18 Halted 0 ms 0 KB -