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
| Метод случайных ходов:
#include <iostream>
#include <iomanip>
#include <ctime>
//глобальные константы, определяющие размерность массива board
const int hor = 8, ver = 8;
//прототип функции для вывода массива, имитирующего шахматную доску, на экран
void printBoard(int[][ver]);
using namespace std;
int main()
{
//выделяем память для массива, эмитирующего шахматную доску
int board[hor][ver] = {0};
//описываем этими двумя массивами варианты ходов конем на доске(их всего восемь от 0 до 7)
int horizontal[hor] = { 2, 1,-1,-2,-2,-1, 1, 2};
int vertical[ver] = {-1,-2,-2,-1, 1, 2, 2, 1};
int a[hor] = {0};
int b[8] = {0};
//массив доступности ходов конем
int accessibility[hor][ver] = {{2,3,4,4,4,4,3,2},
{3,4,6,6,6,6,4,3},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{3,4,6,6,6,6,4,3},
{2,3,4,4,4,4,3,2}};
//переменные, запоминающие текущие координаты нахождения коня
int currentRow, currentColumn;
//переменная, определяющая вариант хода конем(от 0 до 7)
int moveNumber;
//счетчик ходов конем
int counter = 0;
//предложение ввода координаты нахождения коня по горизонтали
cout << "Enter a horizontal coordinate(0 - 7): ";
//сохранение введенных данных в переменной
cin >> currentRow;
//ввод координаты по вертикали
cout << "Enter a vertical coordinate(0 - 7): ";
//сохранение данных ввода
cin >> currentColumn;
//переменные currentRow и currentColumn модифицируються для изменения доступностей, поэтому сохраняем их
int mainRow = currentRow, mainColumn = currentColumn;
//переменные для записи координат следующего хода конем
int Row, Column;
//начинаем поиск решения
for(int i = 1; i <= 64; i++)
{
board[mainRow][mainColumn] = ++counter;
//делаем равным максимально возможной доступности
int minAccessibility = 8;
//временные переменные для исследования субдоступностей
int minA = 8, minB = 8;
//уменьшение доступности на единицу клеток, расположенных в одном ходу от выбранной
for(moveNumber = 0; moveNumber <= 7; moveNumber++)
{
//запоминаем положение коня на доске перед модификацией для изменения доступностей
currentRow = mainRow;
currentColumn = mainColumn;
currentRow += horizontal[moveNumber];
currentColumn += vertical[moveNumber];
//не выходит ли за границы доски
if(currentRow >= 0 && currentRow <= 7 && currentColumn >= 0 && currentColumn <= 7)
{
//уменьшаем доступность всех клеток в одном ходу
accessibility[currentRow][currentColumn]--; // 7 5 5 5 5 7
//если доступность больше, то меняем на меньшую
//если не ходили на нее еще, то делаем на нее ход
if(board[currentRow][currentColumn] == 0)
{
//подготовили координаты к ходу на эту клетку
Row = currentRow; // 5 4
Column = currentColumn; // 2 1
}
}
}
mainRow = Row; // 1
mainColumn = Column ; // 4
}
//вызов функции для печати массива, моделирующего шахматную доску
printBoard(board);
system ("pause void");
return 0;
}
//вывод массива, печатающего шахматную доску, на экран
void printBoard(int array[][ver])
{
cout << endl;
for(int j = 0; j < ver; j++)
{
for(int i = 0; i < hor; i++)
cout << setw(4) << array[i][j];
cout << endl << endl;
}
} |