Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4.  
  5. std::vector<std::vector<int>> parking;
  6. std::vector<std::vector<int>> graph;
  7. std::vector<std::vector<int>> tparking;
  8. std::vector<int> used;
  9. int n = 0, m = 0, numOfZeros = 0;
  10. int ent, ex;
  11.  
  12. bool isThereTheWayVariable;
  13.  
  14. void dfs (int v, int to){ // сам дфс
  15.     if(v == to)
  16.         isThereTheWayVariable = true;
  17.  
  18.     used[v] = true;
  19.  
  20.     for(int i = 0; i < n * m; ++i) {
  21.         if (graph[v][i] && !used[i]) {
  22.             dfs(i, to);
  23.         }
  24.     }
  25. }
  26.  
  27. bool isThereTheWay(int from, int to){ // ну это дфс, че тут
  28.     if(from == to)
  29.         return true;
  30.     isThereTheWayVariable = false;
  31.     used.assign(n * m, 0);
  32.     dfs(from, to);
  33.     return isThereTheWayVariable;
  34. }
  35.  
  36. void buildGraphFromMap(){
  37.     for(int i = 0; i < n; ++i){ // СТРОИМ МАТРИЦУ СМЕЖНОСТИ ПО КАРТЕ ПАРКОВКИ
  38.         for(int j = 0; j < m; ++j){
  39.             if(tparking[i][j] != 1 && i > 0 && tparking[i - 1][j] != 1){
  40.                 graph[i * m + j][i * m + j - m] = 1;
  41.                 graph[i * m + j - m][i * m + j] = 1;
  42.             } if(tparking[i][j] != 1 && i < n - 1 && tparking[i + 1][j] != 1){
  43.                 graph[i * m + j][i * m + j + m] = 1;
  44.                 graph[i * m + j + m][i * m + j] = 1;
  45.             } if(tparking[i][j] != 1 && j > 0 && tparking[i][j - 1] != 1){
  46.                 graph[i * m + j][i * m + j - 1] = 1;
  47.                 graph[i * m + j - 1][i * m + j] = 1;
  48.             } if(tparking[i][j] != 1 && j < m - 1 && tparking[i][j + 1] != 1){
  49.                 graph[i * m + j][i * m + j + 1] = 1;
  50.                 graph[i * m + j + 1][i * m + j] = 1;
  51.             }
  52.         }
  53.     }
  54. }
  55.  
  56. void print2DVector(std::vector<std::vector<int>> toPrint){
  57.     for(int i = 0; i < toPrint.size(); ++i)
  58.         for(int j = 0; j < toPrint[i].size(); ++j)
  59.             std::cout << toPrint[i][j] << (j == toPrint[i].size() - 1 ? "\n" : " ");
  60. }
  61.  
  62. struct Mask{
  63.     int size;
  64.     std::vector<int> *vmask;
  65.  
  66.     Mask(int size){
  67.         this->size = size;
  68.         vmask = new std::vector<int> (size, 0);
  69.     };
  70.  
  71.     bool addOne (){
  72.         bool add = true;
  73.         for(int i = size - 1; i >= 0; --i){
  74.             if(!add)
  75.                 break;
  76.             if((*vmask)[i] == 0)
  77.                 (*vmask)[i] = 5, add = false;
  78.             else
  79.                 (*vmask)[i] = 0, add = true;
  80.         }
  81.  
  82.         if(add)
  83.             return false;
  84.         else
  85.             return true;
  86.     }
  87.  
  88.     int sum(){
  89.         int ans = 0;
  90.         for(int i = 0; i < size; ++i)
  91.             ans += (*vmask)[i];
  92.  
  93.         return ans;
  94.     }
  95.  
  96.     void show(){
  97.         std::cout << "showing\n";
  98.         for(int i = 0; i < (*vmask).size(); ++i)
  99.             std::cout << (*vmask)[i];
  100.         std::cout << '\n';
  101.     }
  102. };
  103.  
  104. int main() {
  105.     std::ifstream input("input.txt");
  106.  
  107.     input >> n >> m;
  108.     std::cout << n << ' ' << m << '\n';
  109.  
  110.     // 0 is for space 1 is for obstacle
  111.     parking.resize(n, std::vector<int> (m, 0));
  112.     graph.resize(n * m, std::vector<int> (n * m, 0));
  113.  
  114.     for(int i = 0; i < parking.size(); ++i) { // ЗАПОЛНЯЕМ КАРТУ ПАРКОВКИ ИЗ ФАЙЛИКА
  115.         for (int j = 0; j < parking[i].size(); ++j) {
  116.             input >> parking[i][j];
  117.             if(!parking[i][j])
  118.                 numOfZeros++;
  119.             if(parking[i][j] == 2)
  120.                 ent = i * m + j;
  121.             if(parking[i][j] == 3)
  122.                 ex = i * m + j;
  123.         }
  124.     }
  125.  
  126.     Mask mask(numOfZeros);
  127.     mask.addOne();
  128.  
  129.     auto bestParking = parking;
  130.     int bestResult = 0;
  131.     do{ // ПРОВЕРЯЕМ ВСЕ ВОЗМОЖНЫЕ ВАРИАНТЫ ПАРКОВОК
  132.         tparking = parking;
  133.  
  134.         int maskIndex = 0;
  135.         for(int i = 0; i < n; ++i) { // расставляем парковки = 5
  136.             for(int j = 0; j < m; ++j){
  137.                 if(tparking[i][j] == 0)
  138.                     tparking[i][j] = (*mask.vmask)[maskIndex], maskIndex++;
  139.             }
  140.         }
  141.  
  142.         buildGraphFromMap();
  143.  
  144.         bool isEnt, isEx, isNice = true;
  145.         for(int i = 0; i < n; ++i) { // проверям что отовсюду можно выехать и везде заехать по свободным дорогам
  146.             for(int j = 0; j < m; ++j){
  147.                 if(tparking[i][j] == 5){
  148.                     isEnt = false, isEx = false;
  149.                     isNice = true;
  150.  
  151.                     if(i * m + j == ent)
  152.                         isEnt = true;
  153.  
  154.                     if(i * m + j == ex)
  155.                         isEx = true;
  156.  
  157.                     if (i > 0 && tparking[i - 1][j] != 1 && tparking[i - 1][j] != 5) {
  158.                         if (isThereTheWay(i * m + j - m, ex))
  159.                             isEx = true;
  160.                         if (isThereTheWay(i * m + j - m, ent))
  161.                             isEnt = true;
  162.                     }
  163.                     if (i < n - 1 && tparking[i + 1][j] != 1 && tparking[i + 1][j] != 5) {
  164.                         if (isThereTheWay(i * m + j + m, ex))
  165.                             isEx = true;
  166.                         if (isThereTheWay(i * m + j + m, ent))
  167.                             isEnt = true;
  168.                     }
  169.                     if (j > 0 && tparking[i][j - 1] != 1 && tparking[i][j - 1] != 5) {
  170.                         if (isThereTheWay(i * m + j - 1, ex))
  171.                             isEx = true;
  172.                         if (isThereTheWay(i * m + j - 1, ent))
  173.                             isEnt = true;
  174.                     }
  175.                     if (j < m - 1 && tparking[i][j + 1] != 1 && tparking[i][j + 1] != 5) {
  176.                         if (isThereTheWay(i * m + j + 1, ex))
  177.                             isEx = true;
  178.                         if (isThereTheWay(i * m + j + 1, ent))
  179.                             isEnt = true;
  180.                     }
  181.  
  182.                     if (!isEnt || !isEx) {
  183.                         isNice = false;
  184.                         break;
  185.                     }
  186.                 }
  187.             }
  188.             if(!isNice)
  189.                 break;
  190.         }
  191.  
  192.         if(isNice && mask.sum() > bestResult)
  193.             bestResult = mask.sum(), bestParking = tparking;
  194.  
  195.     } while(mask.addOne());
  196.  
  197.     std::cout << "max parking places - " <<  bestResult << '\n';
  198.     print2DVector(bestParking);
  199.  
  200.     return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement