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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
#1

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

30.05.2013, 13:35. Просмотров 3077. Ответов 15
Метки нет (Все метки)

Используйте генерацию случайного числа для предоставления коню возможности ходить по шахматной доске случайным образом (конечно, только допустимым

Сам понимаю, что ужасно туплю сейчас, но все же я только учусь.
Вопрос находится в заголовке.
Суть проблемы: понимаю как сделать, но не могу реализовать в программу.
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
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
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
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
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
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
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
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
22 / 11 / 2
Регистрация: 18.11.2012
Сообщений: 458
Завершенные тесты: 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     Ход коня по шахматной доске случайным образом
Ответ Создать тему
Опции темы

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