dimanche 2 avril 2017

maze using threads c++

This is my first post, so I'm sorry if I make any mistakes.

I've been trying to solve a maze using threads, but I'm making some mistakes and would hope that you can help me. I've been get some compilation error, and I don't know why. I guess it's because I'm trying to change the same variable using multiples threads, but don't know how I can fix it.

The file with the maze has the first two numbers as the height and the width. # is the walls, x is the path, e is the entrance and s is the way out.

My code is as follows:

#include<iostream>
#include<fstream>
#include <cstdio>
#include <stack>
#include <vector>
#include <thread>

using namespace std;

void mover(int &x, int &y, const int altura, const int largura, vector<vector<char>> &vetor);

int main() {
 ifstream maze;
 int i, j, in_l, in_c, x = 0, y = 0;
 int largura = 0, altura =0;

 //Carregar o labirinto em maze
 maze.open("maze2.txt", ifstream::in);
 if (!maze)
    {
       cout << "Arquivo nao existe";
       return false;
    }

//Le o tamanho do labirinto
maze >> altura;
maze >> largura;

vector<vector<char> > vetor;
  vetor.resize(altura);
  for (i = 0; i < altura; ++i)
    vetor[i].resize(largura);

//Transferir o arquivo para um vetor
 for(i =0; i <altura ;i++)
 {
     for(j =0; j <largura ;j++)
     {

            maze >> vetor[i][j];
            //cout << vetor[i][j];
     }
 }

//Achar a entrada do labirinto
  for(i =0; i <altura ;i++)
 {
     for(j =0; j <largura ;j++)
     {
         if (vetor[i][j]=='e')
         {
             cout << "Linha: " << i <<"  " << "Coluna: " << j << "\n\n";
             in_l = i;
             in_c = j;
         }
     }
 }

//Passar os valores de entrada para as variaveis x e y
x = in_l;
y = in_c;

cout << "\n\n" << x << "    "<< y << "\n\n\n";

//Repete enquanto a saida nao for achada
  while(!(vetor[x][y] == 's'))
  {
      mover(x, y, altura, largura, vetor);
  }

  cout << "Linha:  "<< x << "  Coluna:  " << y<< endl;;

 maze.close();

 cout << "\n\n" << "Digite uma tecla para continuar...";
 getchar();
 return 0;
}

void mover(int &x, int &y, const int altura, const int largura, vector<vector<char>> &vetor)
{
     int possibilidade = 0;
     int top = 0, bot = 0, frente = 0, tras = 0;

 while(!(vetor[x][y] == 's'))
  {
         //primeira opção: caminho abaixo
       if ((x+1)<altura &&(x+1)>=0 && vetor[x+1][y] == 'x' )
    {
        bot = 1;
        possibilidade++; //existe uma possibilidade de caminho
}
//segunda opção: caminho acima
if ((x-1)<altura &&(x-1)>=0 && vetor[x-1][y] == 'x'  )
{
    top = 1;
    possibilidade++;
}
//terceira opção: caminho a frente
if ((y+1)<largura &&(y+1)>=0&& vetor[x][y+1] == 'x'  )
{
    frente = 1;
    possibilidade++;
    //cout << possibilidade<< "   ";
}
//quarta opção: caminho atras
if ((y-1)<largura &&(y-1)>=0&& vetor[x][y-1] == 'x' )
{
    tras = 1;
    possibilidade++;
}

//Verifica Saida

      //primeira opção: caminho abaixo
  if ((x+1)<altura && (x+1)>=0 && vetor[x+1][y] == 's' )
{
    //bot = 1;
    //possibilidade++; //existe uma possibilidade de caminho
    x += 1;
    y = y;


}
//segunda opção: caminho acima
if ((x-1)<altura &&(x-1)>=0&& vetor[x-1][y] == 's' )
{
    //top = 1;
    //possibilidade++;
    x -= 1;
    y = y;

}
//terceira opção: caminho a frente
if ((y+1)<largura &&(y+1)>=0&& vetor[x][y+1] == 's'  )
{
    x = x;
    y += 1;
    //cout << "Teste" << endl;
    //frente = 1;
    //possibilidade++;

    //cout << possibilidade<< "   ";
}
//quarta opção: caminho a tras
if ((y-1)<largura &&(y-1)>=0 && vetor[x][y-1] == 's' )
{
    x = x;
    y -= 1;
    //tras = 1;
    //possibilidade++;

}

if (possibilidade == 0) //caminho sem saida
{
   return;
    //cout << "Sem Saida" << endl;
}

if (possibilidade == 1) //andar
{
    vetor[x][y] = '_';

    if(top)
    {
        x -= 1;
        y = y;
        top = 0;

    }
    if(bot)
    {
        x += 1;
        y = y;
        bot = 0;
    }
    if(frente)
    {
        x = x;
        y += 1;
        frente = 0;
    }
    if(tras)
    {
        x = x;
        y -= 1;
        tras = 0;
    }
    possibilidade = 0;
    //cout << "Andei" << endl;

}
if (possibilidade > 1) //bifurcaçao
{
    if(top)
    {
        //std::thread worker([&arr]{ return function(arr, row, column); });
        //thread t_top(mover, ref((x-1)), ref(y), altura, largura, ref(vetor));
        x-=1;
        thread t_top([&](){ return mover(x, y, altura, largura, vetor); });
        cout << "t_top" << endl;
        t_top.detach();
        top = 0;
    }
    if(bot)
    {
        x+=1;
        thread t_bot([&](){ return mover(x, y, altura, largura, vetor); });
        //thread t_bot(mover, ref((x+1)), ref(y), altura, largura, ref(vetor));
        cout << "t_bot" << endl;
        t_bot.detach();
        bot = 0;
    }
    if(frente)
    {
        y+=1;
        thread t_frente([&](){ return mover(x, y, altura, largura, vetor); });
        //thread t_frente(mover, ref(x), ref((y+1)), altura, largura, ref(vetor));
        cout << "t_frente" << endl;
        t_frente.detach();
        frente = 0;
    }
    if(tras)
    {
        y-=1;
        thread t_tras([&](){ return mover(x, y, altura, largura, vetor); });
        //thread t_tras(mover, ref(x), ref((y-1)), altura, largura, ref(vetor
        cout << "t_tras" << endl;
        t_tras.detach();
        tras = 0;
    }

    vetor[x][y] = '_';

    possibilidade = 0;

    //cout << "Bifurcacao" << endl;
    }

  }
}

I really appreciate any help you can give me, and if the code is hard to understand, tell me and I can change.

Thank you really much.

Aucun commentaire:

Enregistrer un commentaire