Advertisement
Guest User

djikstra labirinto

a guest
Jul 1st, 2016
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ConsoleColor.h>
  3. #include <stdio.h>
  4. #define V 2476
  5. #define INFINITO 10000
  6. #define peso_aresta 1
  7. using namespace std;
  8. int tam_grafo=0;
  9. vector < int > grafo[2476];
  10. char codigos_ascii[15] = {'>', '^', 200, '<', 205, 188, 202, 'v', 201, 186, 204, 187, 203, 185, 206};
  11. bool cores[2476];
  12. int predecessor[2476];
  13.  
  14. pair < int, int > labirinto[46][56];
  15.  
  16. int dijkstra(int orig, int dest){
  17.         int dist[tam_grafo];
  18.         int visitados[tam_grafo];
  19.         priority_queue < pair<int, int>,
  20.                             vector<pair<int, int> >, greater<pair<int, int> > > pq;
  21.  
  22.         for(int i = 0; i < tam_grafo; i++)
  23.         {
  24.             dist[i] = INFINITO;
  25.             visitados[i] = false;
  26.         }
  27.         dist[orig] = 0;
  28.         pq.push(make_pair(dist[orig], orig));
  29.         while(!pq.empty())
  30.         {
  31.             pair<int, int> p = pq.top();
  32.             int u = p.second;
  33.             pq.pop();
  34.             if(visitados[u] == false)
  35.             {
  36.                 visitados[u] = true;
  37.                 //vector< int >::iterator it;
  38.                 for(int cont=0; cont < tam_grafo; cont++)
  39.                 {
  40.                     int v = cont;
  41.  
  42.                     if(dist[v] >= (dist[u] + peso_aresta))
  43.                     {
  44.                         dist[v] = dist[u] + peso_aresta;
  45.                         pq.push(make_pair(dist[v], v));
  46.                         predecessor[v] = u;
  47.                     }
  48.                 }
  49.             }
  50.  
  51.         }
  52.         return dist[dest];
  53. }
  54.  
  55. void montarAdj(int lin, int col)
  56. {
  57.     int x = labirinto[lin][col].first;
  58.     switch(x)
  59.     {
  60.     case 1:
  61.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  62.         break;
  63.     case 2:
  64.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  65.         break;
  66.     case 3:
  67.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  68.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  69.         break;
  70.     case 4:
  71.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  72.         break;
  73.     case 5:
  74.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  75.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  76.         break;
  77.     case 6:
  78.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  79.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  80.         break;
  81.     case 7:
  82.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  83.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  84.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  85.         break;
  86.     case 8:
  87.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  88.         break;
  89.     case 9:
  90.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  91.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  92.         break;
  93.     case 10:
  94.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  95.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  96.         break;
  97.     case 11:
  98.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  99.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  100.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  101.         break;
  102.     case 12:
  103.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  104.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  105.         break;
  106.     case 13:
  107.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  108.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  109.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  110.         break;
  111.     case 14:
  112.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  113.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  114.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  115.         break;
  116.     case 15:
  117.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col+1].second);
  118.         grafo[labirinto[lin][col].second].push_back(labirinto[lin-1][col].second);
  119.         grafo[labirinto[lin][col].second].push_back(labirinto[lin][col-1].second);
  120.         grafo[labirinto[lin][col].second].push_back(labirinto[lin+1][col].second);
  121.         break;
  122.     }
  123. }
  124.  
  125. int main()
  126. {
  127.     int cnt=1, vertices[100], cont=0;
  128.     for(int i=0; i<45; i++)
  129.     {
  130.         for(int j=0; j<55; j++)
  131.         {
  132.             labirinto[i][j].first = 0;
  133.         }
  134.     }
  135.     FILE *arq;
  136.     int i, j, valor, maiori=0, maiorj=0;
  137.     char lixo;
  138.  
  139.     arq = fopen("normal5.lab.txt", "r");
  140.     if (arq == NULL)
  141.     {
  142.         cout<<"erro"<<endl;
  143.     }
  144.     else lixo = fscanf(arq, "%s %d %d %d", &lixo, &j, &i, &valor);
  145.     while(lixo != EOF)
  146.     {
  147.         lixo = fscanf(arq, "%s %d %d %d", &lixo, &j, &i, &valor);
  148.         labirinto[i][j].first = valor;
  149.  
  150.         if(valor ==16 || valor ==30 || valor ==17 || valor ==31 ){
  151.  
  152.             vertices[cont] = j*i;
  153.             cont++;
  154.  
  155.         }
  156.  
  157.  
  158.  
  159.         // cout << j <<" " << i  << " " << valor << endl;
  160.         if(i>maiori)    maiori=i;
  161.         if(j>maiorj)    maiorj=j;
  162.     }
  163.     fclose(arq);
  164.     tam_grafo= maiori*maiorj;
  165.  
  166.     for(int i=0; i<45; i++)
  167.     {
  168.         for(int j=0; j<55; j++)
  169.         {
  170.             montarAdj(i, j);
  171.         }
  172.     }
  173.     for(int i=0; i<maiori; i++)
  174.     {
  175.         for(int j=0; j<maiorj; j++)
  176.         {
  177.             labirinto[i][j].second = cnt;
  178.             cnt++;
  179.         }
  180.     }
  181.  
  182.     memset(predecessor, 0, sizeof(predecessor));
  183.     //dijkstra(56, 90);
  184.     int x = 90;
  185.     memset(cores, false, sizeof cores);
  186.     while(predecessor[x] != 0)
  187.     {
  188.         cores[x] = true;
  189.         x = predecessor[x];
  190.     }
  191.  
  192.     for(int i=0; i<45; i++)
  193.     {
  194.         for(int j=0; j<55; j++)
  195.         {
  196.             if(cores[labirinto[i][j].second])
  197.             {
  198.                 cout << green << codigos_ascii[labirinto[i][j].first-1];
  199.             }
  200.             else if(labirinto[i][j].first!=0){
  201.                 //cout << white << codigos_ascii[labirinto[i][j].first-1];
  202.                 if(labirinto[i][j].first == 1 || labirinto[i][j].first == 2 || labirinto[i][j].first == 4 || labirinto[i][j].first== 8 )
  203.                         {
  204.                             cout << red << codigos_ascii[labirinto[i][j].first-1];
  205.                            // cout << blue << labirinto[i][j].second;
  206.                         }
  207.                 else {
  208.  
  209.                             cout << white << codigos_ascii[labirinto[i][j].first-1];
  210.                 }
  211.             }
  212.             else
  213.                 cout << " ";
  214.         }
  215.         cout << endl;
  216.     }
  217.             cout<< "o tamanho do grafo é : "<<tam_grafo;
  218.  
  219.  
  220.     return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement