Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <random>
- #include <algorithm>
- #include <fstream>
- #include <stack>
- #include <queue>
- using namespace std;
- void gerarCaminhoDFSIterative(vector<vector<char>>& layout, int startX, int startY, ofstream& outputFileDFS ,ofstream& iterationFile) {
- vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
- random_device rd;
- mt19937 g(rd());
- stack<pair<int, int>> s;
- s.push({startX, startY});
- int largura = layout.size();
- int comprimento = layout[0].size();
- while (!s.empty()) {
- auto [x, y] = s.top();
- s.pop();
- shuffle(directions.begin(), directions.end(), g);
- for (auto& dir : directions) {
- int nx = x + dir.first;
- int ny = y + dir.second;
- if (nx > 0 && nx < largura - 1 && ny > 0 && ny < comprimento - 1 && layout[nx][ny] == '@') {
- layout[nx][ny] = ' ';
- layout[x + dir.first / 2][y + dir.second / 2] = ' ';
- s.push({nx, ny});
- // escreve as iterações em outro .txt
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- iterationFile << layout[i][j] << " ";
- }
- iterationFile << endl;
- }
- iterationFile << endl;
- }
- }
- }
- int saida;
- vector<int> possibilidades_saidaDFS;
- for (int i = 0; i < comprimento; i++) {
- if (layout[largura - 2][i] == ' ') {
- possibilidades_saidaDFS.push_back(i);
- }
- }
- if (!possibilidades_saidaDFS.empty()) {
- saida = possibilidades_saidaDFS[rand() % possibilidades_saidaDFS.size()];
- layout[largura - 1][saida] = ' ';
- }
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- cout << layout[i][j] << " ";
- }
- cout << endl;
- }
- // Write to the final file
- if (outputFileDFS.is_open()) {
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- outputFileDFS << layout[i][j] << " ";
- }
- outputFileDFS << endl;
- }
- outputFileDFS.close();
- cout << "Labirinto e iterações criado lá no labirintoDFS.txt e iteracoes_gerarCaminhoDFS.txt" << endl;
- } else {
- cout << "criacionismo falhou." << endl;
- }
- }
- void gerarCaminhoDFS(vector<vector<char>>& layout, int startX, int startY, ofstream& outputFileDFS ) {
- vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
- random_device rd;
- mt19937 g(rd());
- stack<pair<int, int>> s;
- s.push({startX, startY});
- int largura, comprimento;
- largura = layout.size();
- comprimento = layout[1].size();
- while (!s.empty()) {
- auto [x, y] = s.top();
- s.pop();
- shuffle(directions.begin(), directions.end(), g);
- for (auto& dir : directions) {
- int nx = x + dir.first;
- int ny = y + dir.second;
- if (nx > 0 && nx < layout.size() - 1 && ny > 0 && ny < layout[0].size() - 1 && layout[nx][ny] == '@') {
- layout[nx][ny] = ' ';
- layout[x + dir.first / 2][y + dir.second / 2] = ' ';
- s.push({nx, ny});
- }
- }
- }
- int saida;
- vector<int> possibilidades_saidaDFS;
- for (int i = 0; i < comprimento; i++) {
- if (layout[largura - 2][i] == ' ') {
- possibilidades_saidaDFS.push_back(i);
- }
- }
- if (!possibilidades_saidaDFS.empty()) {
- saida = possibilidades_saidaDFS[rand() % possibilidades_saidaDFS.size()];
- layout[largura - 1][saida] = ' ';
- }
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- cout << layout[i][j] << " ";
- }
- cout << endl;
- }
- //escrever no arquivo final
- if (outputFileDFS.is_open()) {
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- outputFileDFS << layout[i][j] << " ";
- }
- outputFileDFS << endl;
- }
- outputFileDFS.close();
- cout << "Labirinto criado lá no labirintoDFS.txt" << endl;
- }
- else {
- cout << "criacionismo falhou." << endl;
- }
- }
- void gerarCaminhoBFSIterative(vector<vector<char>>& layout, int startX, int startY, ofstream& outputfileBFS ,ofstream& iterationFile) {
- vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
- random_device rd;
- mt19937 g(rd());
- queue<pair<int, int>> q;
- q.push({startX, startY});
- int largura = layout.size();
- int comprimento = layout[0].size();
- while (!q.empty()) {
- auto [x, y] = q.front();
- q.pop();
- shuffle(directions.begin(), directions.end(), g);
- for (auto& dir : directions) {
- int nx = x + dir.first;
- int ny = y + dir.second;
- if (nx > 0 && nx < largura - 1 && ny > 0 && ny < comprimento - 1 && layout[nx][ny] == '@') {
- layout[nx][ny] = ' ';
- layout[x + dir.first / 2][y + dir.second / 2] = ' ';
- q.push({nx, ny});
- // escreve em outro .txt
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- iterationFile << layout[i][j] << " ";
- }
- iterationFile << endl;
- }
- iterationFile << endl;
- }
- }
- }
- int saida;
- vector<int> possibilidades_saidaBFS;
- for (int i = 0; i < comprimento; i++) {
- if (layout[largura - 2][i] == ' ') {
- possibilidades_saidaBFS.push_back(i);
- }
- }
- if (!possibilidades_saidaBFS.empty()) {
- saida = possibilidades_saidaBFS[rand() % possibilidades_saidaBFS.size()];
- layout[largura - 1][saida] = ' ';
- }
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- cout << layout[i][j] << " ";
- }
- cout << endl;
- }
- if (outputfileBFS.is_open()) {
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- outputfileBFS << layout[i][j] << " ";
- }
- outputfileBFS << endl;
- }
- outputfileBFS.close();
- cout << "Labirinto e iterações criado lá no labirintoBFS.txt e iterações_gerarCaminhoBFS.txt" << endl;
- } else {
- cout << "criacionismo falhou." << endl;
- }
- }
- void gerarCaminhoBFS(vector<vector<char>>& layout, int startX, int startY, ofstream& outputfileBFS) {
- vector<pair<int, int>> directions = {{-2, 0}, {2, 0}, {0, -2}, {0, 2}};
- random_device rd;
- mt19937 g(rd());
- queue<pair<int, int>> q;
- q.push({startX, startY});
- int largura, comprimento;
- largura = layout.size();
- comprimento = layout[1].size();
- while (!q.empty()) {
- auto [x, y] = q.front();
- q.pop();
- shuffle(directions.begin(), directions.end(), g);
- for (auto& dir : directions) {
- int nx = x + dir.first;
- int ny = y + dir.second;
- if (nx > 0 && nx < layout.size() - 1 && ny > 0 && ny < layout[0].size() - 1 && layout[nx][ny] == '@') {
- layout[nx][ny] = ' ';
- layout[x + dir.first / 2][y + dir.second / 2] = ' ';
- q.push({nx, ny});
- }
- }
- }
- int saida;
- vector<int> possibilidades_saidaBFS;
- for (int i = 0; i < comprimento; i++) {
- if (layout[largura - 2][i] == ' ') {
- possibilidades_saidaBFS.push_back(i);
- }
- }
- if (!possibilidades_saidaBFS.empty()) {
- saida = possibilidades_saidaBFS[rand() % possibilidades_saidaBFS.size()];
- layout[largura - 1][saida] = ' ';
- }
- // ver o resultado
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- cout << layout[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- if (outputfileBFS.is_open()) {
- for (int i = 0; i < largura; i++) {
- for (int j = 0; j < comprimento; j++) {
- outputfileBFS << layout[i][j] << " ";
- }
- outputfileBFS << endl;
- }
- outputfileBFS.close();
- cout << "Labirinto criado lá no labirintoBFS.txt" << endl;
- } else {
- cout << "criacionismo falhou." << endl;
- }
- }
- int main() {
- // altura e largura
- int largura;
- int comprimento;
- int opc = 0;
- while (opc != 6) {
- cout << "\n----------digite o que você quer fazer----------\ndigite 1 para gerar um labirinto DFS\ndigite 2 para gerar um labirinto BFS\ndigite 3 para gerar o labirinto DFS com as iterações\ndigite 4 para gerar o labirinto BFS com iterações\n e 6 para sair: ";
- cin >> opc;
- switch (opc) {
- case 1: {
- cout << "\ndigite a largura e comprimento do labirinto: ";
- cin >> largura >> comprimento;
- vector<vector<char>> layoutDFS(largura, vector<char>(comprimento, '@'));
- ofstream outputFileDFS("labirintoDFS.txt");
- if (!outputFileDFS.is_open()) {
- cout << "Faiô.txt" << endl;
- return 1;
- }
- random_device rd;
- mt19937 g(rd());
- int entrada = rand() % (comprimento - 2) + 1;
- layoutDFS[0][entrada] = ' ';
- gerarCaminhoDFS(layoutDFS, 1, entrada, outputFileDFS);
- outputFileDFS.close();
- cout << endl;
- break;
- }
- case 2: {
- cout << "\ndigite a largura e comprimento do labirinto: ";
- cin >> largura >> comprimento;
- vector<vector<char>> layoutBFS(largura, vector<char>(comprimento, '@'));
- random_device rd;
- mt19937 g(rd());
- int entrada = rand() % (comprimento - 2) + 1;
- ofstream outputFileBFS("labirintoBFS.txt");
- if (!outputFileBFS.is_open()) {
- cout << "Faiô.txt" << endl;
- return 1;
- }
- // definir o começo
- layoutBFS[0][entrada] = ' ';
- gerarCaminhoBFS(layoutBFS, 1, entrada, outputFileBFS);
- outputFileBFS.close();
- break;
- }
- case 3: {
- cout << "\ndigite a largura e comprimento do labirinto: ";
- cin >> largura >> comprimento;
- vector<vector<char>> layoutDFS(largura, vector<char>(comprimento, '@'));
- ofstream iterationFileDFS("iteracoes_gerarCaminhoDFS.txt");
- if (!iterationFileDFS.is_open()) {
- cout << "Faiô.txt" << endl;
- return 1;
- }
- ofstream outputFileDFS("labirintoDFS.txt");
- if (!outputFileDFS.is_open()) {
- cout << "Faiô.txt" << endl;
- return 1;
- }
- random_device rd;
- mt19937 g(rd());
- int entrada = rand() % (comprimento - 2) + 1;
- layoutDFS[0][entrada] = ' ';
- gerarCaminhoDFSIterative(layoutDFS, 1, entrada, outputFileDFS, iterationFileDFS);
- iterationFileDFS.close();
- outputFileDFS.close();
- cout << endl;
- break;
- }
- case 4: {
- cout << "\ndigite a largura e comprimento do labirinto: ";
- cin >> largura >> comprimento;
- vector<vector<char>> layoutBFS(largura, vector<char>(comprimento, '@'));
- random_device rd;
- mt19937 g(rd());
- int entrada = rand() % (comprimento - 2) + 1;
- ofstream iterationFileBFS("iteracoes_gerarCaminhoBFS.txt");
- if (!iterationFileBFS.is_open()) {
- cout << "Faiô.txt" << endl;
- return 1;
- }
- ofstream outputFileBFS("labirintoBFS.txt");
- if (!outputFileBFS.is_open()) {
- cout << "Faiô.txt" << endl;
- return 1;
- }
- // definir o começo
- layoutBFS[0][entrada] = ' ';
- gerarCaminhoBFSIterative(layoutBFS, 1, entrada, outputFileBFS, iterationFileBFS);
- iterationFileBFS.close();
- outputFileBFS.close();
- break;
- }
- case 6:
- cout << "Saindo..." << endl;
- break;
- default:
- cout << "Opção inválida. Tente novamente." << endl;
- break;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment