powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обход конем шахматной доски
1 сообщений из 1, страница 1 из 1
Обход конем шахматной доски
    #33756473
cadge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно есть задача, обойти конем доску (8x8, я тестирую алгоритм на 5х5) с использованием стэков.
Конечно есть множество решений на сайтах с комбинаторикой, но хочется сделать самому.

Собственно текст моей программы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
#include <iostream>
using namespace std;
#define N  5 

class stack
{
	int st[N*N][ 2 ];								//массив хранящий в себе информацию о передвижениях коня
	int obr[N*N*N*N][ 4 ];						//массив с записями обращений из main
	short top;									//счетчик элементов в стеке
public:
	stack(): top(- 1 ) {for(int i= 0 ; i<N*N; i++) {st[i][ 0 ]= 0 ; st[i][ 1 ]= 1 ; }}
	void push(int var_i, char var_c) { st[++top][ 0 ]=var_i; st[top][ 1 ]=(int)var_c; }			//функция добавления элемента в стек
	int& pop() { return st[top--][ 0 ];}														//функция возвращающая элемент стека
	int& out_c() { return st[top][ 1 ];}														//функция возвращающая элемент стека
	int& out_i() { return st[top][ 0 ];}														//функция возвращающая элемент стека
	void begin();																			//прототип функции ввода начальных координат коня				
	void step( stack&);																		//прототип функции хода коня по полю
	short& p_top() { return top;}															//функция возвращающая номер текущего элемента стека
	int end_p (int,char,int,char);															//прототип функции проверки границ поля
	friend int prov_z (int,int,stack&);											//прототип функции проверки занятых точек
};

//////////////////////////////////
void stack::begin ()								//функция ввода начальных координат коня
{
	int v;
	char c;
	cout<<"Введите координаты коня на поле: ";
	cin>>c>>v;
	push(v,(char&)c); 
};


////////////////////////
int stack::end_p(int p_i,char p_c,int var_i,char var_c)		//функция проверки границ поля
{	
	if ((p_i+var_i>N)||(p_i+var_i< 1 )||(p_c+var_c>char(N+ 96 ))||(p_c+var_c<'a')) return  0 ;
	else return  1 ;
}
////////////////

int itop= 0 ;

/////////////////////////////
int prov_z(int p_i,int p_c,stack& si)      //проверка занятых клеток
{
	for(int i= 0 ; i<si.top; i++)  
		if (si.st[i][ 0 ]==p_i&&si.st[i][ 1 ]==p_c) return  0 ;
	return  1 ;
		
}

/////////////////////////////////
int poisk_od(int sti1, int sti2,int stj1, int stj2 ,int obr[][ 4 ])									//поиск повторяющихся ходов
{
	for (int i= 0 ;i<N*N*N*N;i++)
		if ((sti1==obr[i][ 0 ]&&sti2==obr[i][ 1 ]&&stj1==obr[i][ 2 ]&&stj2==obr[i][ 3 ])||(sti1==obr[i][ 2 ]&&sti2==obr[i][ 3 ]&&stj1==obr[i][ 0 ]&&stj2==obr[i][ 1 ])) {obr[i][ 2 ]= 0 ;obr[i][ 3 ]= 0 ; return  0 ; } 
	return  1 ;
}

//////////////////
void stack::step(stack& si)						//функция хода коня
{	
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]+ 2 ,st[top][ 1 ]+ 1 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ], 2 , 1 )&&prov_z(st[top][ 0 ]+ 2 ,st[top][ 1 ]+ 1 ,si))     { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]+ 2 ; obr[itop][ 3 ]=st[top][ 1 ]+ 1 ; itop++; push(st[top][ 0 ]+ 2 ,st[top][ 1 ]+ 1 ); }
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]- 2 ,st[top][ 1 ]+ 1 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ],- 2 , 1 )&&prov_z(st[top][ 0 ]- 2 ,st[top][ 1 ]+ 1 ,si))    { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]- 2 ; obr[itop][ 3 ]=st[top][ 1 ]+ 1 ; itop++;push(st[top][ 0 ]- 2 ,st[top][ 1 ]+ 1 ); } 
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]+ 2 ,st[top][ 1 ]- 1 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ], 2 ,- 1 )&&prov_z(st[top][ 0 ]+ 2 ,st[top][ 1 ]- 1 ,si))    { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]+ 2 ; obr[itop][ 3 ]=st[top][ 1 ]- 1 ; itop++;push(st[top][ 0 ]+ 2 ,st[top][ 1 ]- 1 );  }
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]- 2 ,st[top][ 1 ]- 1 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ],- 2 ,- 1 )&&prov_z(st[top][ 0 ]- 2 ,st[top][ 1 ]- 1 ,si))   { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]- 2 ; obr[itop][ 3 ]=st[top][ 1 ]- 1 ; itop++;push(st[top][ 0 ]- 2 ,st[top][ 1 ]- 1 );  }
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]+ 1 ,st[top][ 1 ]+ 2 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ], 1 , 2 )&&prov_z(st[top][ 0 ]+ 1 ,st[top][ 1 ]+ 2 ,si))     { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]+ 1 ; obr[itop][ 3 ]=st[top][ 1 ]+ 2 ;itop++; push(st[top][ 0 ]+ 1 ,st[top][ 1 ]+ 2 );  }
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]- 1 ,st[top][ 1 ]+ 2 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ],- 1 , 2 )&&prov_z(st[top][ 0 ]- 1 ,st[top][ 1 ]+ 2 ,si))    { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]- 1 ; obr[itop][ 3 ]=st[top][ 1 ]+ 2 ;itop++; push(st[top][ 0 ]- 1 ,st[top][ 1 ]+ 2 );  }
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]+ 1 ,st[top][ 1 ]- 2 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ], 1 ,- 2 )&&prov_z(st[top][ 0 ]+ 1 ,st[top][ 1 ]- 2 ,si))    { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]+ 1 ; obr[itop][ 3 ]=st[top][ 1 ]- 2 ; itop++;push(st[top][ 0 ]+ 1 ,st[top][ 1 ]- 2 );  }
	else
	if (poisk_od(st[top][ 0 ],st[top][ 1 ],st[top][ 0 ]- 1 ,st[top][ 1 ]- 2 ,obr)&&end_p(st[top][ 0 ],st[top][ 1 ],- 1 ,- 2 )&&prov_z(st[top][ 0 ]- 1 ,st[top][ 1 ]- 2 ,si))   { obr[itop][ 0 ]=st[top][ 0 ]; obr[itop][ 1 ]=st[top][ 1 ]; obr[itop][ 2 ]=st[top][ 0 ]- 1 ; obr[itop][ 3 ]=st[top][ 1 ]- 2 ; itop++;push(st[top][ 0 ]- 1 ,st[top][ 1 ]- 2 );  }
	else
	pop(); 
}


//////////////////
int main()
{
	stack si; 
	si.begin(); 
	while (si.p_top()!=N*N- 1 )				//цикл до конца заполнения стека
	{
		if (si.p_top()==- 1 ) {cout<<"Не возможно пройти"<<endl; exit( 1 );}
		si.step(si); 
		// cout<<si.p_top()<<"  ||  "<<si.out_i()<<" "<<(char)si.out_c()<<endl;  
	}
	for (int i= 0 ; i<N*N; i++)			//цикл вывода всех элементов стека
		cout<<si.pop()<<" "<<(char)si.out_c()<<endl;  
	return  0 ;
}

создаю класс стэк и работаю через него. Поставил ограничения на возможности хода, но он зацикливается и не могу понять почему.

Помогите найти алгоритмическую ошибку.
заранее благодарен.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обход конем шахматной доски
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]