Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <queue>
- std::ifstream f("labirint.in");
- std::ofstream g("labirint.out");
- const int dx[] = { -1 , 1 , 0 , 0 };
- const int dy[] = { 0 , 0 , 1 , -1 };
- const int NMAX = 1005;
- int n,m,cost[NMAX][NMAX],cost2[NMAX][NMAX];
- char matrix[NMAX][NMAX];
- bool vis[NMAX][NMAX];
- std::queue<std::pair<int,int>>Q;
- std::vector<std::pair<int,int>>chei;
- std::vector<std::pair<int,int>>iesiri;
- bool isValid(int i,int j){
- return i >= 1 && i <= n && j >= 1 && j <= m;
- }
- int main(){
- f >> n >> m;
- for(int i = 1;i <= n;++i){
- for(int j = 1;j <= m;++j){
- f >> matrix[i][j];
- if(matrix[i][j] == 'A'){
- Q.push({i,j});
- vis[i][j] = true;
- cost[i][j] = 1;
- }else if(matrix[i][j] == 'B'){
- chei.push_back({i,j});
- cost2[i][j] = 1;
- }else if(matrix[i][j] == 'C'){
- iesiri.push_back({i,j});
- }
- }
- }
- // Lee 'A' -> 'B'
- while(!Q.empty()){
- int i = Q.front().first;
- int j = Q.front().second;
- Q.pop();
- for(int dir = 0;dir < 4;++dir){
- int next_i = i + dx[dir];
- int next_j = j + dy[dir];
- if(isValid(next_i,next_j) && !vis[next_i][next_j]){
- if(matrix[next_i][next_j] != 'Z'){
- vis[next_i][next_j] = true;
- cost[next_i][next_j] = cost[i][j] + 1;
- Q.push( {next_i,next_j} );
- }
- }
- }
- }
- while(!Q.empty())
- Q.pop();
- for(int i = 1;i <= n;++i)
- for(int j = 1;j <= m;++j)
- vis[i][j] = false;
- for(auto cheie : chei){
- Q.push(cheie);
- vis[cheie.first][cheie.second] = true;
- }
- // B -> C
- while(!Q.empty()){
- int i = Q.front().first;
- int j = Q.front().second;
- Q.pop();
- for(int dir = 0;dir < 4;++dir){
- int next_i = i + dx[dir];
- int next_j = j + dy[dir];
- if(isValid(next_i,next_j) && !vis[next_i][next_j]){
- if(matrix[next_i][next_j] != 'Z'){
- if(matrix[next_i][next_j] != 'C'){
- vis[next_i][next_j] = true;
- cost2[next_i][next_j] = cost2[i][j] + 1;
- Q.push( {next_i,next_j} );
- }else{
- vis[next_i][next_j] = true;
- cost2[next_i][next_j] = cost2[i][j];
- Q.push( {next_i,next_j} );
- }
- }
- }
- }
- }
- //cost -> chei
- //cost2 ->iesiri
- /*
- for(int i = 1;i <= n;++i,g << '\n')
- for(int j = 1;j <= m;++j)
- g << cost2[i][j] << ' ';
- */
- int sol = (1 << 30);
- for(int i = 0;i < iesiri.size();++i)
- for(int j = 0;j < chei.size();++j)
- if(cost[ chei[j].first ][ chei[j].second ] +
- cost2[ iesiri[i].first ][iesiri[i].second] < sol)
- sol = cost[ chei[j].first ][ chei[j].second ] +
- cost2[ iesiri[i].first ][iesiri[i].second] ;
- g << sol;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement