Форум программистов, компьютерный форум CyberForum.ru

Ход коня по шахматной доске случайным образом - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 13:35     Ход коня по шахматной доске случайным образом #1
Используйте генерацию случайного числа для предоставления коню возможности ходить по шахматной доске случайным образом (конечно, только допустимым

Сам понимаю, что ужасно туплю сейчас, но все же я только учусь.
Вопрос находится в заголовке.
Суть проблемы: понимаю как сделать, но не могу реализовать в программу.
C++
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#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;
   }
}
вообщем как я понял нам необходимо подсчитать с начала все ходы,
C++
1
currentRow += horizontal[moveNumber];
затем записать их в отдельный массив и в нем найти минимальное значение и максимальное, после чего мы берем рандомом это число. Надеюсь на помощь) Спасибо)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 14:35     Ход коня по шахматной доске случайным образом #2
Цитата Сообщение от undertacker Посмотреть сообщение
Сам понимаю, что ужасно туплю сейчас, но все же я только учусь.
Вопрос находится в заголовке.
Суть проблемы: понимаю как сделать, но не могу реализовать в программу.

вообщем как я понял нам необходимо подсчитать с начала все ходы,
C++
1
currentRow += horizontal[moveNumber];
затем записать их в отдельный массив и в нем найти минимальное значение и максимальное, после чего мы берем рандомом это число. Надеюсь на помощь) Спасибо)
Это задача про движение коня из 4-й главы Дейтла? Я недавно делал эту задачу и могу Вам сказать, что код "Вашей" программы взят отсюда Путешествие коня
Я его тоже сначала анализировал, чтобы понять. Потом пошел правильным вариантом. В задаче автор рекомендует делать ее пошагово. Сначала без эвристики, потом с. Пока Вы самостоятельно не разберетесь, для чего нужны все эти массивы, когда их вызывать и что в них содержится - задачу Вы не решите.
Если конкретно по вопросу, то заставить коня ходить случайным образом можно случайным образом генерируя переменную
C++
1
moveNumber = rand() % 8;
З.Ы. В коде Вашего источника, по моему мнению, много бесполезных переменных.

Добавлено через 34 минуты
__0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0

Суть в чем. Предположим, что конь начинает ходить из координат (2, 3) = 1(номер хода. Чтобы вообще ему походить, у Вас есть 2 массива
C++
1
2
int horizontal[hor] = { 2, 1,-1,-2,-2,-1, 1, 2};
int vertical[ver] =   {-1,-2,-2,-1, 1, 2, 2, 1};
Эти массивы содержат сдвиги текущих координат(горизонтальной и вертикальной) для каждого из 8-ми возможных вариантов хода коня.
Чтобы походить конем "случайно", нужно сместить его текущие координаты на значения из вышеуказанных массивов при условии, что значение на доске с учетом смещения будет равно 0 ( то есть конь там еще не был). Это можно сделать циклом for по счетчику ходов, проверяя для каждого хода условие доступности клетки и условия не выхода за поле. Первый же ход, удовлетворяющий условиям можно расценивать как случайный.
Например, возьмем сначала ход номер 0. Он удовлетворяет условию, т.к. 2 + vertical[0] = 1, 3 + horizontal[0] = 5. В итоге конь станет на доске в координатах (1, 5):

__0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 2 0 0
2 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0


Примерно так:
C++
1
2
3
4
5
6
7
8
for (int j = 0; j < hor; j++)
        {
            if (row + vert[j] < 8 && row + vert[j] >=0 
                && column + hori[j] < 8 && column + hori[j] >=0 
                && b[row + vert[j]][column + hori[j]] == 0)
                                   currentRow += vertical[moveNumber];
                       currentColumn += horizontal[moveNumber];
                 }
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 17:20  [ТС]     Ход коня по шахматной доске случайным образом #3
Мимино, Мимино, из 7 главы, да-автор Дейтел
Цитата Сообщение от Мимино Посмотреть сообщение
Пока Вы самостоятельно не разберетесь, для чего нужны все эти массивы
там их всего 2. 1 для эвристики() 2 забит нулями( в ходе решения его забиваем найденными минимальными координатами)
Цитата Сообщение от Мимино Посмотреть сообщение
то заставить коня ходить случайным образом можно случайным образом генерируя переменную
ты пробовал это делать?

Добавлено через 4 минуты
есть у кого еще предложения?
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 18:44     Ход коня по шахматной доске случайным образом #4
Цитата Сообщение от undertacker Посмотреть сообщение
ты пробовал это делать?
конечно нет я без эвристики брал первый возможный ход, который удовлетворял условиям.

Добавлено через 5 минут
Цитата Сообщение от undertacker Посмотреть сообщение
2 забит нулями( в ходе решения его забиваем найденными минимальными координатами)
ммм... Это как? Либо я Вас не понимаю, либо Вы не понимаете логики задачи.
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 18:56  [ТС]     Ход коня по шахматной доске случайным образом #5
Мимино,
Цитата Сообщение от Мимино Посмотреть сообщение
ммм... Это как? Либо я Вас не понимаю, либо Вы не понимаете логики задачи.
C++
1
int board[hor][ver] = {0};
Цитата Сообщение от Мимино Посмотреть сообщение
конечно нет
но твой вариант либо не работает, либо у меня не получается его применить
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 19:05     Ход коня по шахматной доске случайным образом #6
Цитата Сообщение от undertacker Посмотреть сообщение
int board[hor][ver] = {0};
Это и есть шахматная доска. Каждая клетка, в которой не бывал конь, равна 0. Решением задачи (и с эвристикой и без) является заполнение каждого элемента этого массива номером хода коня (от 1 до 64 включительно). Заполняя доску(делая ходы) случайным образом можно будет увидеть, что часто конь не проделывает весь путь, а загоняет себя в безвыходное положение, из которого нет возможных ходов на не посещенную клетку.
При решении с эвристикой конь уже не делает случайных ходов, а принимает решение на основании доступности клетки. В самые труднодоступные он ходит в первую очередь.

Добавлено через 2 минуты
Массив
C++
1
int accessibility[hor][ver]
как раз содержит информацию о доступности клеток шахматной доски. Читается так: в клетку (0,0) можно походить всего из 2-х других клеток. В клетку (0,1) можно походить всего из 3-х других клеток и т.д.
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 19:14  [ТС]     Ход коня по шахматной доске случайным образом #7
Мимино, мы топчимся на месте) я все это уже давно понял) меня интересует другое)
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 19:21     Ход коня по шахматной доске случайным образом #8
Код
Конь стоит в координатах board[hor][ver]
Ходим конем
for (номер хода = 0; номер хода <=7; номер хода++)
     если (конь не выходит за пределы поля && в новой клетке конь еще не бывал)
              делаем ход (смещаем координаты на значения массивов);
              break;
Или вот еще вариант случайного хода конем
Код
Конь стоит в координатах board[hor][ver]
Ходим конем
ход = false
while (ход != true)
{
    номер_хода = rand() % 8;
    если (конь не выходит за пределы поля && в новой клетке конь еще не бывал)
            ход = true;
}
 делаем ход (смещаем координаты на значения массивов);
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 19:30  [ТС]     Ход коня по шахматной доске случайным образом #9
Мимино, не) не очень мне такое нравится)
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 19:45     Ход коня по шахматной доске случайным образом #10
Цитата Сообщение от undertacker Посмотреть сообщение
Мимино, не) не очень мне такое нравится)
Я могу выложить готовый код. Но какой в этом смысл?
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 20:08  [ТС]     Ход коня по шахматной доске случайным образом #11
Мимино, ну давай уже код. Смысл в понимании и анализировании.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 20:35     Ход коня по шахматной доске случайным образом #12
Цитата Сообщение от undertacker Посмотреть сообщение
Мимино, ну давай уже код. Смысл в понимании и анализировании.
Смысл как раз в понимании задачи и написании своего кода.

Вот без эвристики. Случайным ходом считается первый возможный от 0 до 7
C++
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
const int hor = 8, ver = 8;
 
void boardPrint(int [][ver], int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int board[hor][ver] = {0};
    int horizontal[hor] = {2, 1, -1, -2, -2, -1, 1, 2};
    int vertical[ver] = {-1, -2, -2, -1, 1, 2, 2, 1};
    int currentRow, currentColumn, countMove = 1;
    bool status = false;
 
    while (status == false)
    {
        cout << "Введите текущие координаты коня через пробел ([строка],[столбец])(0-7): ";
        cin >> currentRow >> currentColumn;
        if (currentRow < 8 && currentRow >=0 && currentColumn < 8 && currentColumn >=0)
            status = true;
        else
            cout << "Таких координат не существует. Попробуейте снова." << endl;
    }
 
    for (int move = 1; move <= 64; move++)
    {
        board[currentRow][currentColumn] = move;
 
        for (int j = 0; j < hor; j++)
            if (currentRow + vertical[j] < 8 && currentRow + vertical[j] >=0 
                && currentColumn + horizontal[j] < 8 && currentColumn + horizontal[j] >=0 
                && board[currentRow + vertical[j]][currentColumn + horizontal[j]] == 0)
                {
                    currentRow += vertical[j];
                    currentColumn += horizontal[j];
                    countMove++;
                    break;
                }
    }
 
    cout << endl << "Сделано ходов: " << countMove << endl << endl;
    boardPrint(board, hor);
    system("pause");
    return 0;
}
 
 
void boardPrint(int b[][ver], int horiz)
{
    for (int i = 0; i < horiz; i++)
    {
        for (int j = 0; j < horiz; j++)
            cout << setw(4) << b[i][j];
        cout << endl << endl;
    }
}
Добавлено через 7 минут
Немного поправил, чтобы останавливать ходы при безвыходности.

C++
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
const int hor = 8, ver = 8;
 
void boardPrint(int [][ver], int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int board[hor][ver] = {0};
    int horizontal[hor] = {2, 1, -1, -2, -2, -1, 1, 2};
    int vertical[ver] = {-1, -2, -2, -1, 1, 2, 2, 1};
    int currentRow, currentColumn, countMove = 1;
    bool status = false;
 
    while (status == false)
    {
        cout << "Введите текущие координаты коня через пробел ([строка],[столбец])(0-7): ";
        cin >> currentRow >> currentColumn;
        if (currentRow < 8 && currentRow >=0 && currentColumn < 8 && currentColumn >=0)
            status = true;
        else
            cout << "Таких координат не существует. Попробуейте снова." << endl;
    }
 
    for (int move = 1; move <= 64; move++)
    {
        board[currentRow][currentColumn] = move;
        status = false;
 
        for (int j = 0; j < hor; j++)
            if (currentRow + vertical[j] < 8 && currentRow + vertical[j] >=0 
                && currentColumn + horizontal[j] < 8 && currentColumn + horizontal[j] >=0 
                && board[currentRow + vertical[j]][currentColumn + horizontal[j]] == 0)
                {
                    currentRow += vertical[j];
                    currentColumn += horizontal[j];
                    countMove++;
                    status = true;
                    break;
                }
        if (status == false)
            break;
    }
 
    cout << endl << "Сделано ходов: " << countMove << endl << endl;
    boardPrint(board, hor);
    system("pause");
    return 0;
}
 
 
void boardPrint(int b[][ver], int horiz)
{
    for (int i = 0; i < horiz; i++)
    {
        for (int j = 0; j < horiz; j++)
            cout << setw(4) << b[i][j];
        cout << endl << endl;
    }
}
А вот результаты. Без эвристики и с эвристикой.
Миниатюры
Ход коня по шахматной доске случайным образом   Ход коня по шахматной доске случайным образом  
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.05.2013, 20:46  [ТС]     Ход коня по шахматной доске случайным образом #13
Мимино,блин, видать ты меня не понял. Мне необходимо не циклом, а именно через rand()....
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
30.05.2013, 21:07     Ход коня по шахматной доске случайным образом #14
Цитата Сообщение от undertacker Посмотреть сообщение
Мимино,блин, видать ты меня не понял. Мне необходимо не циклом, а именно через rand()....
Вот с rand()
C++
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
const int hor = 8, ver = 8;
 
void boardPrint(int [][ver], int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int board[hor][ver] = {0};
    int horizontal[hor] = {2, 1, -1, -2, -2, -1, 1, 2};
    int vertical[ver] = {-1, -2, -2, -1, 1, 2, 2, 1};
    int currentRow, currentColumn, countMove = 1, moveNumber;
    bool status = false;
 
    while (status == false)
    {
        cout << "Введите текущие координаты коня через пробел ([строка],[столбец])(0-7): ";
        cin >> currentRow >> currentColumn;
        if (currentRow < 8 && currentRow >=0 && currentColumn < 8 && currentColumn >=0)
            status = true;
        else
            cout << "Таких координат не существует. Попробуейте снова." << endl;
    }
 
    for (int move = 1; move <= 64; move++)
    {
        board[currentRow][currentColumn] = move;
        status = false;
 
        for (int j = 0; j < hor; j++)
            if (currentRow + vertical[j] < 8 && currentRow + vertical[j] >=0 
                && currentColumn + horizontal[j] < 8 && currentColumn + horizontal[j] >=0 
                && board[currentRow + vertical[j]][currentColumn + horizontal[j]] == 0)
            {
                    status = true;
                    break;
            }
 
        while (status == true)
        {
            moveNumber = rand() % 8;
            if (currentRow + vertical[moveNumber] < 8 && currentRow + vertical[moveNumber] >=0 
                && currentColumn + horizontal[moveNumber] < 8 && currentColumn + horizontal[moveNumber] >=0 
                && board[currentRow + vertical[moveNumber]][currentColumn + horizontal[moveNumber]] == 0)
                {
                    currentRow += vertical[moveNumber];
                    currentColumn += horizontal[moveNumber];
                    countMove++;
                    break;
                }
        }
 
        if (status == false)
            break;
    }
 
    cout << endl << "Сделано ходов: " << countMove << endl << endl;
    boardPrint(board, hor);
    system("pause");
    return 0;
}
 
 
void boardPrint(int b[][ver], int horiz)
{
    for (int i = 0; i < horiz; i++)
    {
        for (int j = 0; j < horiz; j++)
            cout << setw(4) << b[i][j];
        cout << endl << endl;
    }
}
Solitaire Raven
 Аватар для Solitaire Raven
33 / 33 / 10
Регистрация: 20.04.2015
Сообщений: 198
27.10.2015, 21:43     Ход коня по шахматной доске случайным образом #15
Можно здесь поподробнее?
C++
1
2
int horizontal[hor] = { 2, 1,-1,-2,-2,-1, 1, 2};
int vertical[ver] =   {-1,-2,-2,-1, 1, 2, 2, 1};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2016, 21:52     Ход коня по шахматной доске случайным образом
Еще ссылки по теме:

C++ Задача о зернах на шахматной доске
C++ Дейтел ход коня(выход за массив)
C++ Ход коня
C++ Покрытие шахматной доски ходом коня
C++ Передвижение коня по доске и сбор букв

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Liss29
 Аватар для Liss29
20 / 9 / 2
Регистрация: 18.11.2012
Сообщений: 407
Завершенные тесты: 1
03.05.2016, 21:52     Ход коня по шахматной доске случайным образом #16
В дополнении к заданию:
Наиболее вероятно, что предыдущая программа совершит относительно корот*
кое путешествие. Теперь модифицируйте ваш у программу так, чтобы она сде*
лала 1000 попыток путешествия. Используйте одномерный массив для регист*
рации количества путешествий каждой длины. По окончании 1000 попыток
путешествия программа должна напечатать эту информацию в строгом табу*
лированном формате. Каков наилучший результат?


Это значит, что нужно создать цикл из 1000 повторений, только не понял модифицировать это
C++
1
for(int i = 1; i <= 64; i++)
или создать цикл в котором 1000 раз будет повторяться заполнение массива board?
C++
1
2
3
 for(int n = 1; n <= 1000; n++)
  {
    for(int i = 1; i <= 64; i++)
Что нужно не пойму...

Добавлено через 23 часа 27 минут
По моему разобрался.

Добавлено через 16 минут
Вот ещё в дополнительном задании с конями нужно модифицировать программу таким образом чтобы она работала до тех пор, пока не будут сделаны все 64 хода, я попытался реализовать так:
Кликните здесь для просмотра всего текста
C++
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
void printBoard(int [][8]);
 
using namespace std;
int main()
{
    int board[8][8] = {0};
    int passes[1000] = {0};
    
    int horizontal[8] = {2, 1, -1, -2, -2, -1, 1, 2};
    int vertical[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
 
    
    int currentRow, currentColumn, moveNumber;
    int counter = 1;
    bool status = false;
    
    srand(time(0));
    //нужно написать программу, которая будет выполняться
    //до победного конца, иначе до полного путешествия коня.
    while(status == false)
    {
        cout << "Введите координату по горизонтали: ";
        cin >> currentRow;
        cout << "Введите координату по вертикали: ";
        cin >> currentColumn;
        if(currentRow >= 0 && currentRow < 8 && currentColumn >= 0 && currentColumn < 8)
        status = true;
      else
        cout << "Недопустимый диапазон ввода, попробуйте ещё раз" << endl;
    }
  while(counter != 64)
  {
    for(; ;)
    {
        board[currentRow][currentColumn] = counter;
        status = false;
        for(int j = 0; j < 8; j++)
        {
            if(currentRow + horizontal[j] >= 0 && currentRow + horizontal[j] < 8 && currentColumn + vertical[j] >= 0 && currentColumn + vertical[j] < 8 && board[currentRow + horizontal[j]][currentColumn + vertical[j]] == 0)
            {
                status = true;
                break;
            }
        }
        
        while(status == true)
        {
            moveNumber = rand() % 8;
            if(currentRow + horizontal[moveNumber] >= 0 && currentRow + horizontal[moveNumber] < 8 && currentColumn + vertical[moveNumber] >= 0 && currentColumn + vertical[moveNumber] < 8 && board[currentRow + horizontal[moveNumber]][currentColumn + vertical[moveNumber]] == 0)
            {
               currentRow += horizontal[moveNumber];
               currentColumn += vertical[moveNumber];
               counter++;
               break;
            }
        }
         
        if(counter == 64)
            break;
        else
            continue;
    }
    
  }
    cout << "Сделано ходов " << counter << endl;
    printBoard(board);
    return 0;
}

но ничего не происходит, на первый взгляд, хотя в книге явно даётся сообщение, что она может выполняться часами даже на мощных компьютерах. Вот и хочу спросить программа годная или она тупо войдёт в бесконечный цикл?

И ещё не понял такой момент: Снова заведите таблицу для регистрации
количества путешествий каждой длины и напечатайте эту таблицу, как толь*
ко будет выполнено первое полное путешествие. Сколько путеш ествий попы *
талась совершить программа перед выполнением полного путеш ествия?

Как я понял нужно создать массив для сохранения результатов, каких ...результатов количества ходов?!, но размер массива какой... я даже представить боюсь, если она будет циклится часами, то это невераятное количество значений или я что-то не так понял?

Может всё же кто-то соизволит помочь, объяснить толково!
Yandex
Объявления
03.05.2016, 21:52     Ход коня по шахматной доске случайным образом
Ответ Создать тему
Опции темы

Текущее время: 16:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru