Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2014, 21:53   #1
mta0
Пользователь
 
Регистрация: 18.09.2013
Сообщений: 23
Радость (С++/С)Выход из лабиринта с помощью очереди

Лабиринт. Лабиринт задан массивом в котором элемент = 0, если клетка «проходима», и = 1, если клетка «непроходима» (задается случайным образом). Начальное положение путника указывается в проходимой клетке . Путник может перемещаться по проходимым клеткам, имеющим общую сторону. Выяснить, может ли путник выйти из лабиринта ( т.е. попасть в граничную клетку).
Решил реализовать решение с помощью очередей, в очередь я забиваю элемент снизу, сверху, слева,справа , проверяю их на наличие нуля, после чего , если элемент содержит нуль, присваиваю этому элементу "8". Все это фарширую в цикл do while , который должен повторять процедуру снова и снова, пока первый элемент в очереди будет равен "0".
В итоге, вместо пути выхода из массива выложенного "8" у меня выводит обычный массив нулей и единиц с восьмеркой, в месте начала пути. Не судите строго, это мой первый код с очередью.
Вопрос : "Как было бы правильней использовать очередь?"

Код:
#include "stdafx.h"
#include <iostream>
#include <queue>
using namespace std;
const int max_n = 21;
int lab[max_n][max_n] = { 0 };
int n,i;  // n - ввод размера массива i - счетчик
void ochered(int x, int y);



int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_CTYPE, "Russian");
	               
	int x, y;                             
	cout << "Введите размер лабиринта! (меньше 20) : ";
	cin >> n;
	if (n < max_n)
	{
		cout << "Введите координаты шахтера! (через пробел) : ";
		cin >> x >> y;
		cout << "Кол во проходов " << i << endl;
		for (int row = 0; row < n; ++row)               // создаю лабиринт из 0 и 1
		{
			for (int col = 0; col < n; ++col)
			{
				lab[row][col] = rand() % 2;
				//lab[row][col] = 0;
				lab[x][y] = 8;                   // местоположение человека
				
			}
		}

		ochered(x, y);
	
		for (int row = 0; row < n; ++row)
		{
			for (int col = 0; col < n; ++col)
			{
			cout << lab[row][col];
			
			
			}
			cout << endl;
		}
		

		system("pause");
		return 0;
	}



	else
	{
		cout << "Лабиринт слишком огромен!"<< endl;
		system("pause");
	}
	
}

void ochered(int x, int y)
{
	queue<int> myQueue;
	do
	{
		i++;
		myQueue.push(lab[x - 1][y]);
		myQueue.push(lab[x + 1][y]);
		myQueue.push(lab[x][y - 1]);
		myQueue.push(lab[x][y + 1]);
		if (myQueue.front() == 0)
		{
			myQueue.front() = 8;
		}
		else
		{
			myQueue.pop();
		}
	} while (myQueue.front() == 0);

}
mta0 вне форума Ответить с цитированием
Старый 19.03.2014, 22:24   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

В общем, тебе нужен еще один массив, где хранятся посещенные клетки и при добавлении нового элемента надо определять не только возможность прохождения, но и проверять, была ли клетка посещена раньше.
Smogg вне форума Ответить с цитированием
Старый 19.03.2014, 22:50   #3
mta0
Пользователь
 
Регистрация: 18.09.2013
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
В общем, тебе нужен еще один массив, где хранятся посещенные клетки и при добавлении нового элемента надо определять не только возможность прохождения, но и проверять, была ли клетка посещена раньше.
Добавил массив memlab ,элемент которого , при проверки на нуль в очереди становится восьмеркой. Далее чтобы перейти в след клетку, элемент нужно будет проверить на нуль и наличие восьмерки в memlab, наличие которой скажет что переходить в эту клетку нельзя.
Тем не менее все равно результат тот же.(

Код:
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <queue>
using namespace std;
const int max_n = 21;
int lab[max_n][max_n] = { 0 };
int memlab[max_n][max_n] = { 0 };
int n,i;  // n - ввод размера массива i - счетчик
void ochered(int x, int y);



int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_CTYPE, "Russian");
	               
	int x, y;                             
	cout << "Введите размер лабиринта! (меньше 20) : ";
	cin >> n;
	if (n < max_n)
	{
		cout << "Введите координаты шахтера! (через пробел) : ";
		cin >> x >> y;
		cout << "Кол во проходов " << i << endl;
		for (int row = 0; row < n; ++row)               // создаю лабиринт из 0 и 1
		{
			for (int col = 0; col < n; ++col)
			{
				lab[row][col] = rand() % 2;
				//lab[row][col] = 0;
				lab[x][y] = 8;                   // местоположение человека
				
			}
		}

		ochered(x, y);
	
		for (int row = 0; row < n; ++row)
		{
			for (int col = 0; col < n; ++col)
			{
			cout << lab[row][col];
			
			
			}
			cout << endl;
		}
		

		system("pause");
		return 0;
	}



	else
	{
		cout << "Лабиринт слишком огромен!"<< endl;
		system("pause");
	}
	
}

void ochered(int x, int y)
{
	queue<int> myQueue;
	int k=0, z = 0;
	do
	{
		i++;
		k++;
		z++;
		myQueue.push(lab[x - 1][y]);
		myQueue.push(lab[x + 1][y]);
		myQueue.push(lab[x][y - 1]);
		myQueue.push(lab[x][y + 1]);
		if (myQueue.front() == 0)
		{
			myQueue.front() = memlab[k][z]=8;
		}
		if ( (myQueue.front() == 0) && (memlab[k][z] != 8) )
		{
			myQueue.front() = 8;
		}
		else
		{
			myQueue.pop();
		}
	} while (myQueue.front() == 0);

}

}

Последний раз редактировалось mta0; 19.03.2014 в 23:08.
mta0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из лабиринта /C++ dzels Помощь студентам 2 06.06.2013 15:14
С заданной целочисленной очереди организовать две: первая содержит все положительные элементы данной очереди, вторая - отрицательн wowan30002 Общие вопросы C/C++ 0 20.11.2012 17:39
Кнопка Выход(на выход Из программы)С++ Напишите код ProGec4 Общие вопросы C/C++ 3 19.02.2012 15:36
Алгоритм Дейкстры поиска путей в графе. Как реализовать с помощью приоритетной очереди? Zefick Помощь студентам 0 04.06.2009 14:03
Выход из лабиринта karamelka87 Общие вопросы C/C++ 9 27.01.2009 23:49