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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2010, 21:46   #1
РагнаР
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
По умолчанию Задача про лабиринт. Не могу найти ошибку

Не могу понять, почему иногда эта программа выдает ошибку, а иногда работает хорошо. Помогите разобраться,пожалуйста. При дебагк выдаёт иногда
First-chance exception at 0x012d5394 in labirint deep.exe: 0xC0000005: Access violation reading location 0xfdfdfe1d.
Unhandled exception at 0x012d5394 in labirint deep.exe: 0xC0000005: Access violation reading location 0xfdfdfe1d.

Код:
#include<iostream>
#include <time.h>
#include<cmath>
using namespace std;
int main()
{
	setlocale(LC_ALL,".1251");
	srand(time(0));
	//создание динамического массива
	int N;
	cout<<"Введите размер матрицы(N*N)(N<=20)"<<endl;
	cin>>N;
	while((N<1)||(N>20))
		{cout<<" Размер задан неверно, введите заново "<<endl;
		cin>>N;}
	int **mas,elem;                 
	mas = new int *[N];         
	for (int i=0; i<N; i++)     
		 mas[i] = new int [N]; 
	int vybor;
	cout<<" Для заполнения лабиринта случайно введите 1 "<<endl;
	cout<<" Для заполнения лабиринта вручную, введите 2"<<endl;
	cin>>vybor;
	switch (vybor)
	{
	case 1:
		{srand(time(0));
		
		cout<<" Лабиринт "<<endl;
		for (int i=0; i<N; i++)
			for (int j=0;j<N;j++)
				mas[i][j] = rand()%2;}
		break;
	case 2:
		{for(int i=0;i<N;i++)
			for(int j=0;j<N;j++)
				{cout<< "Введите элемент[ "<<i+1<<" ][ "<<j+1<<" ] (0-проход,1-стена)"<<endl;
				cin>>elem;
	while((elem!=0)&&(elem!=1))
		{cout<<" Неверный символ. Введите 0 для прохода, 1 для стены"<<endl;
		cin>>elem;}
	mas[i][j]=elem;}}break;
	default: cout<<" Неправильный ввод.Программа будет завершена"<<endl;
	return 0;}	
	for (int i=0;i<N;i++)
		{for(int k=0;k<N;k++)
			printf( "%3d",mas[i][k]);			
		cout<<endl;}
	 int k,l;
	cout<<" Введите координаты начальной комнаты"<<endl;
	cin>>k>>l;
	while((k<0)||(l<0)||(k>=N)||(l>=N)||(mas[k][l]==1))
	{cout<<"Координаты заняты стеной или находятся вне лабиринта. Введите координаты правильно "<<endl;
	cin>>k>>l;}	
//поиск пути
	mas[k][l]=-1;	
	for( int num=-1;num+N*N>0;num--)
		for(int i=1;i<N-1;i++)
			for (int j=1;j<N-1;j++)
	if(mas[i][j]==num)
			{{if(mas[i+1][j]==0)
				mas[i+1][j]=num-1;}
			{if(mas[i-1][j]==0)
				mas[i-1][j]=num-1;}
			{if(mas[i][j+1]==0)
				mas[i][j+1]=num-1;}
			{if(mas[i][j-1]==0)
				mas[i][j-1]=num-1;}
			}
	//нахождение максимума на границе
	int max=-N*N,mi=-1,mj=-1;
	for ( int i=0;i<N;i++)
		{if((mas[i][0]>max)&&(mas[i][0]<0))
			{max=mas[i][0];
			mi=i;
			mj=0;}
		if((mas[i][N-1]>max)&&(mas[i][N-1]<0))
			{max=mas[i][N-1];
			mi=i;
			mj=N-1;}}
	for(int j=0;j<N;j++)
		{if ((mas[0][j]>max)&&(mas[0][j]<0))
			{max=mas [0][j];
			mi=0;
			mj=j;}
		if ((mas[N-1][j]>max)&&(mas[N-1][j]<0))
			{max=mas[N-1][j];
			mi=N-1;
			mj=j;}}
	//нахождение пути
	if(max==-N*N)
		cout<<" Прохода нет "<<endl;
	else 
	{ cout<<"Искомый путь"<<endl;
	for(int a=max-1;a<0;a++)
	{{if (mas[mi-1][mj]==a)      //Вот здесь иногда возникает ошибка
		mi=mi-1;}
	{ if (mas[mi+1][mj]==a)
		mi++;}
	{if (mas[mi][mj-1]==a)
		mj--;}
	{if (mas[mi][mj+1]==a)
		mj++;}
	cout<<"[ "<<mi<<" ][ "<<mj<<" ]"<<endl;}}	
	return 0;
}

Последний раз редактировалось РагнаР; 22.10.2010 в 22:09.
РагнаР вне форума Ответить с цитированием
Старый 22.10.2010, 21:58   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Какую именно ошибку и в каком месте?
И оформите код в тег CODE (значок #), а то читать невозможно.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 22.10.2010, 22:11   #3
РагнаР
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 25
По умолчанию

Оформил по-новому.
РагнаР вне форума Ответить с цитированием
Старый 22.10.2010, 22:28   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
else
{ cout<<"Искомый путь"<<endl;
for(int a=max-1;a<0;a++)
{ if (mi-1 >= 0) if (mas[mi-1][mj]==a) //Вот здесь иногда возникает ошибка
mi=mi-1;
if (mi+1 < N) if (mas[mi+1][mj]==a)
mi++;
if (mj-1 >= 0) if (mas[mi][mj-1]==a)
mj--;
if (mj+1 < N) if (mas[mi][mj+1]==a)
mj++;
cout<<"[ "<<mi<<" ][ "<<mj<<" ]"<<endl;}}
Особо в логику не вникал, но может дело только в выводе.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на ряд Тейлора - не могу найти ошибку _NooB_ Помощь студентам 0 30.09.2010 14:53
Не могу найти ошибку maxistudent Общие вопросы C/C++ 6 29.04.2010 20:52
Не могу найти ошибку в программе про рентабельность pergeot Паскаль, Turbo Pascal, PascalABC.NET 1 03.11.2009 14:46
С++. не могу найти ошибку world12_tk Помощь студентам 3 25.07.2009 10:47