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