Submission #115736

# Submission time Handle Problem Language Result Execution time Memory
115736 2019-06-08T19:55:00 Z Leonardo_Paes Portal (COCI17_portal) C++11
96 / 120
92 ms 20792 KB
#include <bits/stdc++.h>
#define MAXN 510
using namespace std;

typedef pair < int, int > ii;
typedef pair < int, ii > iii;

int n, m, val[MAXN][MAXN], c, f, vist[MAXN*MAXN];
char mat[MAXN][MAXN];

int l[MAXN][MAXN], r[MAXN][MAXN], u[MAXN][MAXN], d[MAXN][MAXN];

vector < int > grafo[MAXN*MAXN];

int bfs()
{
	queue < ii > fila;
	fila.push({c, 0});

	while(fila.size())
	{
		ii u = fila.front();
		fila.pop();
		int v = u.first;
		int d = u.second;

		if(vist[v]) continue;
		vist[v] = d;

		//cout << v << ' ' << d << endl;
		if(v == f) return d;

		for(int i = 0 ; i < grafo[v].size() ; i++)
		{
			int at = grafo[v][i];
			if(!vist[at]) fila.push({at, d+1});
		}
	}

	return -1;
}

int main()
{
	cin >> n >> m;
	int cont = 1;
	for(int i = 1 ; i <= n ; i++)
	{
		for(int j = 1 ; j <= m ; j++)
		{
			cin >> mat[i][j];
			val[i][j] = cont++;
			if(mat[i][j] == 'C') c = cont-1;
			else if(mat[i][j] == 'F') f = cont-1;
		}
	}

	// vizinhos esquerda

	int last =0;

	for(int i=1; i<=n; i++){
		for(int j=1; j<=m; j++){
			if(mat[i][j]=='#'){
				last=j;
			}
			else{
				if(mat[i+1][j]=='#')l[i][j]=val[i][last+1];
				if(mat[i-1][j]=='#')l[i][j]=val[i][last+1];
				if(mat[i][j+1]=='#')l[i][j]=val[i][last+1];
				if(mat[i][j-1]=='#')l[i][j]=val[i][last+1];
			}
		}
	}

	// vizinhos direita

	for(int i=1; i<=n; i++){
		for(int j=m; j>=1; j--){
			if(mat[i][j]=='#'){
				last=j;
			}
			else{
				if(mat[i+1][j]=='#')r[i][j]=val[i][last-1];
				if(mat[i-1][j]=='#')r[i][j]=val[i][last-1];
				if(mat[i][j+1]=='#')r[i][j]=val[i][last-1];
				if(mat[i][j-1]=='#')r[i][j]=val[i][last-1];
			}
		}
	}

	// vizinhos cima

	for(int j=1; j<=m; j++){
		for(int i=1; i<=n; i++){
			if(mat[i][j]=='#'){
				last=i;
			}
			else{
				if(mat[i+1][j]=='#')u[i][j]=val[last+1][j];
				if(mat[i-1][j]=='#')u[i][j]=val[last+1][j];
				if(mat[i][j+1]=='#')u[i][j]=val[last+1][j];
				if(mat[i][j-1]=='#')u[i][j]=val[last+1][j];
			}
		}
	}


	// vizinhos baixo

	for(int j=1; j<=m; j++){
		for(int i=n; i>=1; i--){
			if(mat[i][j]=='#'){
				last=i;
			}
			else{
				if(mat[i+1][j]=='#')d[i][j]=val[last-1][j];
				if(mat[i-1][j]=='#')d[i][j]=val[last-1][j];
				if(mat[i][j+1]=='#')d[i][j]=val[last-1][j];
				if(mat[i][j-1]=='#')d[i][j]=val[last-1][j];
			}
		}
	}

	for(int i=1; i<=n; i++){
		for(int j=1; j<=m; j++){
			if(mat[i][j]=='#')continue;
			if(mat[i+1][j]!='#')grafo[val[i][j]].push_back(val[i+1][j]);
			if(mat[i-1][j]!='#')grafo[val[i][j]].push_back(val[i-1][j]);
			if(mat[i][j+1]!='#')grafo[val[i][j]].push_back(val[i][j+1]);
			if(mat[i][j-1]!='#')grafo[val[i][j]].push_back(val[i][j-1]);
			
			if(mat[i+1][j]=='#')
			{
				grafo[val[i][j]].push_back(r[i][j]);
				grafo[val[i][j]].push_back(d[i][j]);
				grafo[val[i][j]].push_back(l[i][j]);
				grafo[val[i][j]].push_back(u[i][j]);
			}
			else if(mat[i-1][j]=='#'){
				grafo[val[i][j]].push_back(r[i][j]);
				grafo[val[i][j]].push_back(d[i][j]);
				grafo[val[i][j]].push_back(l[i][j]);
				grafo[val[i][j]].push_back(u[i][j]);
			}
			else if(mat[i][j+1]=='#'){
				grafo[val[i][j]].push_back(r[i][j]);
				grafo[val[i][j]].push_back(d[i][j]);
				grafo[val[i][j]].push_back(l[i][j]);
				grafo[val[i][j]].push_back(u[i][j]);
			}
			else if(mat[i][j-1]=='#'){
				grafo[val[i][j]].push_back(r[i][j]);
				grafo[val[i][j]].push_back(d[i][j]);
				grafo[val[i][j]].push_back(l[i][j]);
				grafo[val[i][j]].push_back(u[i][j]);
			}
		}
	}

	/*for(int i = 1 ; i <= n ; i++)
	{
		for(int j = 1 ; j <= m ; j++)
		{
			cout << "VERT: " << i << ' ' << j << endl;
			for(int k = 0 ; k < grafo[val[i][j]].size() ; k++)
			{
				cout << grafo[val[i][j]][k] << ' ';
			}
			cout << endl;
		}
	}*/

	vist[0] = 1;
	int resp = bfs();

	if(resp == -1) cout << "nemoguce\n";
	else cout << resp << endl;
}

Compilation message

portal.cpp: In function 'int bfs()':
portal.cpp:33:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0 ; i < grafo[v].size() ; i++)
                   ~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 7 ms 6528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 6528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 6528 KB Output is correct
2 Correct 7 ms 6528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 6528 KB Output is correct
2 Correct 7 ms 6528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 6656 KB Output is correct
2 Correct 7 ms 6528 KB Output is correct
3 Correct 7 ms 6580 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 9216 KB Output is correct
2 Correct 13 ms 8056 KB Output is correct
3 Correct 15 ms 8276 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 10176 KB Output is correct
2 Correct 16 ms 9216 KB Output is correct
3 Correct 17 ms 8960 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 56 ms 15864 KB Output is correct
2 Correct 37 ms 12536 KB Output is correct
3 Correct 34 ms 12664 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 84 ms 18808 KB Output is correct
2 Correct 59 ms 17144 KB Output is correct
3 Correct 53 ms 14712 KB Output is correct
4 Incorrect 47 ms 14816 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Incorrect 92 ms 20792 KB Output isn't correct
2 Halted 0 ms 0 KB -