Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Solução do problema para apenas um caso de teste
- #include<bits/stdc++.h>
- #define MAXN 510
- #define pii pair<int,int>
- using namespace std;
- char m[MAXN][MAXN];
- int marc[MAXN][MAXN];
- int dist[MAXN][MAXN];
- int l, c;
- int dx[] = {0, 0, 1, -1};
- int dy[] = {1, -1, 0, 0};
- vector<pii> focos;
- void bfs_ms(){
- queue<pii> q;
- for(auto e : focos){
- q.push(e);
- marc[e.first][e.second] = 1;
- dist[e.first][e.second] = 0;
- }
- while(!q.empty()){
- pii v = q.front(); q.pop();
- int x = v.first;
- int y = v.second;
- for(int k = 0; k <= 3; k++){
- int nx = x + dx[k];
- int ny = y + dy[k];
- if(nx < 0 || nx >= l) continue;
- if(ny < 0 || ny >= c) continue;
- if(m[nx][ny] == '#' || marc[nx][ny] == 1) continue;
- q.push({nx, ny});
- marc[nx][ny] = 1;
- dist[nx][ny] = dist[x][y]+1;
- }
- }
- }
- int bfs(pii s){
- memset(marc, 0, sizeof marc);
- queue<pii> q;
- q.push(s);
- marc[s.first][s.second] = 1;
- dist[s.first][s.second] = 0;
- while(!q.empty()){
- pii v = q.front(); q.pop();
- int x = v.first;
- int y = v.second;
- if(x == 0 || x == l-1 || y == 0 || y == c-1) return dist[x][y]+1;
- for(int k = 0; k <= 3; k++){
- int nx = x + dx[k];
- int ny = y + dy[k];
- if(nx < 0 || nx >= l) continue;
- if(ny < 0 || ny >= c) continue;
- if(m[nx][ny] == '#' || marc[nx][ny] == 1) continue;
- if(dist[x][y]+1 < dist[nx][ny]){
- q.push({nx, ny});
- marc[nx][ny] = 1;
- dist[nx][ny] = dist[x][y]+1;
- }
- }
- }
- return -1;
- }
- int main(){
- scanf("%d %d",&c, &l);
- pii ini;
- for(int i = 0; i < l; i++){
- for(int j = 0; j < c; j++){
- scanf(" %c", &m[i][j]);
- if(m[i][j] == '*') focos.push_back({i,j});
- if(m[i][j] == '@') ini = {i,j};
- }
- }
- bfs_ms();
- //for(int i = 0; i < l; i++){
- // for(int j = 0; j < c; j++){
- // printf("%d ", marc[i][j]);
- // }
- // printf("\n");
- //}
- int resp = bfs(ini);
- printf("%d", resp);
- }
Add Comment
Please, Sign In to add comment