Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85

Определить поля в которые может попасть конь за n ходов из указанной позиции

06.03.2017, 13:44. Показов 4887. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите, пожалуйста!!!
на шахматной доске определить поля в которые может попасть конь за n ходов из указанной позиции.
я сделала пока вариант,когда конь может пойти только +1 по х и +2 по у. Но ничего не выходит, даже в цикл не заходит!
подскажите,что не так, и как сделать!!!
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
#include <iostream>
#include <math.h> 
using namespace std;
 
int ** steps(int razm,int horse_pos_x,int horse_pos_y,int number_of_steps,int ** chess_board) {
    int count=0
    ;
    while (count!=number_of_steps){
    if ((horse_pos_x+1<razm)&&(horse_pos_y+2<razm)){
    count++;
    chess_board[horse_pos_x+1][horse_pos_y+2]=count;
    
    
    steps(razm,horse_pos_x+1,horse_pos_y+2,number_of_steps,chess_board);}
     
    }
    return chess_board;
   }
    
int main(){
    int razm,horse_pos_x,horse_pos_y,number_of_steps;
    cout<<"enter all this shit in order";
        cin>>razm>>horse_pos_x>>horse_pos_y>>number_of_steps;
    int** chess_board=new int*[razm];
          for (int i=0;i<razm;i++) 
             chess_board[i]=new int[razm]; 
    for (int i=0;i<razm;i++){
        for (int j=0;j<razm;j++)
        chess_board[i][j]=0;}
       
        
        steps(razm,horse_pos_x,horse_pos_y,number_of_steps,chess_board);
         for (int i=0;i<razm;i++){
             cout<<" "<<endl;
        for (int j=0;j<razm;j++) 
        //if (chess_board[i][j]==number_of_steps)
        cout<<chess_board[i][j]<<" ";}
        
        
        
return 0;
}
Добавлено через 2 часа 17 минут
вот правильно считает для 1 вида хода +1 по х и +2 по у
как сделать,чтобы остальные считал,я не знаю!!!
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
#include <iostream>
#include <math.h> 
using namespace std;
int count=0;
 
int ** steps(int razm,int horse_pos_x,int horse_pos_y,int number_of_steps,int ** chess_board) {
    while (count!=number_of_steps){
    if (((horse_pos_x+1)<=razm)&&((horse_pos_y+2)<=razm)){
    count++;
    //cout<<count<<endl;
    chess_board[(horse_pos_x+1)][(horse_pos_y+2)]=count;
    
    
    steps(razm,horse_pos_x+1,horse_pos_y+2,number_of_steps,chess_board);
    }
     
    }
    return chess_board;
   }
    
int main(){
    int razm,horse_pos_x,horse_pos_y,number_of_steps;
    cout<<"enter all this shit in order";
        cin>>razm>>horse_pos_x>>horse_pos_y>>number_of_steps;
    int** chess_board=new int*[razm];
          for (int i=0;i<razm;i++) 
             chess_board[i]=new int[razm]; 
    for (int i=0;i<razm;i++){
        for (int j=0;j<razm;j++)
        chess_board[i][j]=0;}
       
        
        steps(razm,horse_pos_x,horse_pos_y,number_of_steps,chess_board);
         for (int i=0;i<razm;i++){
             cout<<" "<<endl;
        for (int j=0;j<razm;j++) 
        if (chess_board[i][j]==number_of_steps)
        cout<<i<<" "<<j;}
        //cout<<chess_board[i][j]<<" ";}
        
        
return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2017, 13:44
Ответы с готовыми решениями:

На шахматной доске определить поля, в которые может попасть конь за n ходов из указанной позиции (рекурсия)
На шахматной доске определить поля, в которые может попасть конь за n ходов из указанной позиции.Размер шахматной доски также вводится. ...

Вычислить позиции, на которые конь может попасть за 2 хода
Вся задача сводится к тому, чтобы вычислить позиции на которые конь может попасть за 2 хода(и расставить в порядке возрастания): ...

Список всех клеток, на которые может попасть конь с указанной клетки за один ход
Вам дана строка, содержащая координату клетки на шахматном поле (например, “A2”). Напишите функцию possible_turns(cell), которая будет по...

4
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
06.03.2017, 21:43
Лучший ответ Сообщение было отмечено marymap как решение

Решение

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
#include <iostream>
#include <cstring>
 
using namespace std;
 
bool validSquare(int x, int y)
{
    return x >= 0 && y >= 0 && x < 8 && y < 8;
}
 
void markKnightReachableSquares(int board[8][8], int x0, int y0, int depth)
{
    if (depth == 0) {
        board[y0][x0] = 1;
        return;
    }
 
    const int dx[8] = { -2, -2, -1, -1,  1,  1,  2, 2 };
    const int dy[8] = { -1,  1, -2,  2, -2,  2, -1, 1 };
 
    for (int i=0; i<8; i++)
    {
        const int x = x0 + dx[i];
        const int y = y0 + dy[i];
 
        if (validSquare(x, y))
        {
            board[y][x] = 1;
            markKnightReachableSquares(board, x, y, depth-1);
        }
    }
}
 
void printBoard(int board[8][8])
{
    for (int i=0; i<8; i++)
    {
        for (int j=0; j<8; j++)
            cout << (board[i][j] ? 'O' : '-') << ' ';
        cout << '\n';
    }
}
 
int main()
{
    int board[8][8] = {0};
    const int x0 = 4;
    const int y0 = 3;
 
    markKnightReachableSquares(board, x0, y0, 1);
    printBoard(board);
 
    ::memset(board, 0, sizeof(board));
    cout << '\n';
 
    markKnightReachableSquares(board, x0, y0, 2);
    printBoard(board);
}
Добавлено через 37 минут
Тут правда нужно уточнить условие: поля, достигаемые ровно за n ходов, или не менее, чем за n ходов. Моя программа реализует второй вариант. Если нужен первый вариант, то тогда надо закомментировать 28 строку.
1
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
06.03.2017, 22:27  [ТС]
вот,что у меня получилось.
не знаю, стоит ли создавать еще одну функцию, чтобы не было подряд 8 if
если есть идеи оптимизации,то пишите,пожалуйста!!!
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
#include <iostream>
#include <math.h>  
using namespace std;
bool prov(int x, int y,int razm){
    return ((x >= 0) && (y >= 0 )&& (x < razm) && (y < razm));
}
int ** func(int ** chess_board, int horse_pos_x, int horse_pos_y, int razm, int key,int step)
{
    if (key != step) {
        key++;
        if (prov(horse_pos_x+1,horse_pos_y+2,razm))
        {
            chess_board[horse_pos_y + 2][horse_pos_x + 1] = key;
            func(chess_board, horse_pos_x + 1, horse_pos_y + 2, razm, key, step);
        }
        if (prov(horse_pos_x+2,horse_pos_y+1,razm))
        {
            chess_board[horse_pos_y + 1][horse_pos_x + 2] = key;
            func(chess_board, horse_pos_x + 2, horse_pos_y + 1, razm, key, step);
        }
        if (prov(horse_pos_x+2,horse_pos_y-1,razm))
        {
            chess_board[horse_pos_y - 1][horse_pos_x + 2] = key;
            func(chess_board, horse_pos_x + 2, horse_pos_y - 1, razm, key, step);
        }
        if (prov(horse_pos_x+1,horse_pos_y-2,razm))
        {
            chess_board[horse_pos_y - 2][horse_pos_x + 1] = key;
            func(chess_board, horse_pos_x + 1, horse_pos_y - 2, razm, key, step);
        }
        if (prov(horse_pos_x-1,horse_pos_y-2,razm))
        {
            chess_board[horse_pos_y - 2][horse_pos_x - 1] = key;
            func(chess_board, horse_pos_x - 1, horse_pos_y - 2, razm, key, step);
        }
        if (prov(horse_pos_x-2,horse_pos_y-1,razm))
        {
            chess_board[horse_pos_y - 1][horse_pos_x - 2] = key;
            func(chess_board, horse_pos_x - 2, horse_pos_y - 1, razm, key, step);
        }
        if (prov(horse_pos_x-2,horse_pos_y+1,razm))
        {
            chess_board[horse_pos_y + 1][horse_pos_x - 2] = key;
            func(chess_board, horse_pos_x - 2, horse_pos_y + 1, razm, key, step);
        }
        if (prov(horse_pos_x-1,horse_pos_y+2,razm))
        {
            chess_board[horse_pos_y + 2][horse_pos_x - 1] = key;
            func(chess_board, horse_pos_x - 1, horse_pos_y + 2, razm, key, step);
        }
    }
    return chess_board;}
int main()
{
    int n, k = 0, horse_pos_x, horse_pos_y, step;
 
    cout << "ENTER RAZM:" << endl;
    while ((!(cin >> n)) || (n <= 0)) {
        cin.clear();
        while (cin.get() != '\n');
        cout << "error! ";
        cout << "enter razm again: ";
    }
    int **chess_board = new int*[n];
    for (int i = 0; i < n; i++)
        chess_board[i] = new int[n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            chess_board[i][j] = 0;
    }
    cout << "enter horse position:" << endl;
    while ((!(cin >> horse_pos_x >> horse_pos_y)) || (horse_pos_x <= 0) || (horse_pos_y <= 0)) {
        cin.clear();
        while (cin.get() != '\n');
        cout << "error! ";
        cout << "enter horse position again: ";
    }horse_pos_x--;
    horse_pos_y--;  
    cout << "enter number of turns" << endl;
    while ((!(cin >> step)) || (step <= 0)) {
        cin.clear();
        while (cin.get() != '\n');
        cout << "error! ";
        cout << "enter number of turns again: ";
    }
    chess_board[horse_pos_y][horse_pos_x] = -1;
    func(chess_board, horse_pos_x, horse_pos_y, n, k,step);
    for (int i = 0; i < n; i++) {
        cout << " " << endl;
        for (int j = 0; j < n; j++) {
            if (chess_board[i][j] == step)
            cout << "x= " << j+1 << " " << "y= " << i+1<<endl; 
            //cout << chess_board[i][j] << " ";
        }
    }
    system("pause");
    return 0;
}
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
06.03.2017, 22:40
Цитата Сообщение от marymap Посмотреть сообщение
чтобы не было подряд 8 if
Использовать цикл.
0
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 85
06.03.2017, 22:55  [ТС]
готовая
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 <math.h>  
using namespace std;
bool prov(int x, int y,int razm){
    return ((x >= 0) && (y >= 0 )&& (x < razm) && (y < razm));
}
void func(int ** chess_board, int horse_pos_x, int horse_pos_y, int razm,int step)
{
    if (step == 0) {
        chess_board[horse_pos_y][horse_pos_x] = 1;
        return;
    }
 
     int new_x[8] = { -2, -2, -1, -1,  1,  1,  2, 2 };
     int new_y[8] = { -1,  1, -2,  2, -2,  2, -1, 1 };
 
    for (int i=0; i<8; i++)
    {
         int x = horse_pos_x + new_x[i];
         int y = horse_pos_y + new_y[i];
 
        if (prov(x,y,razm))
        {
            //shess_board[y][x] = 1;
            func(chess_board, x, y,razm ,step-1);
        }
    }}
int main()
{
    int n, horse_pos_x, horse_pos_y, step;
 
    cout << "ENTER RAZM:" << endl;
    while ((!(cin >> n)) || (n <= 0)) {
        cin.clear();
        while (cin.get() != '\n');
        cout << "error! ";
        cout << "enter razm again: ";
    }
    int **chess_board = new int*[n];
    for (int i = 0; i < n; i++)
        chess_board[i] = new int[n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            chess_board[i][j] = 0;
    }
    cout << "enter horse position:" << endl;
    while ((!(cin >> horse_pos_x >> horse_pos_y)) || (horse_pos_x <= 0) || (horse_pos_y <= 0)) {
        cin.clear();
        while (cin.get() != '\n');
        cout << "error! ";
        cout << "enter horse position again: ";
    }horse_pos_x--;
    horse_pos_y--;  
    cout << "enter number of turns" << endl;
    while ((!(cin >> step)) || (step <= 0)) {
        cin.clear();
        while (cin.get() != '\n');
        cout << "error! ";
        cout << "enter number of turns again: ";
    }
    chess_board[horse_pos_y][horse_pos_x] = -1;
    func(chess_board, horse_pos_x, horse_pos_y,n,step);
    for (int i = 0; i < n; i++) {
        cout << " " << endl;
        for (int j = 0; j < n; j++) {
            if (chess_board[i][j] == 1)
            cout << "x= " << j+1 << " " << "y= " << i+1<<endl; 
            //cout << chess_board[i][j] << " ";
        }
    }
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2017, 22:55
Помогаю со студенческими работами здесь

Найти поля, на которые может попасть шахматный конь за один прыжок из данной клетки
На пустой шахматной доске в одной из клеток стоит шахматный конь. Напишите программу, которая выводит на экран список клеток, которые конь...

Вывести все возможные поля, на которые может попасть шахматный конь за один прыжок из данной клетки
Здравствуйте! Помогите решить задачку и написать программу на С++! Шахматный конь. Вася решил научиться играть в шахматы. Он нашел...

Определить поля, на которые может пройти белый конь
Даны натуральные числа a,b,c,d, каждое из которых не превосходит восьми. Определить поля(отметить их символом +), на кот-е может пройти...

Может ли шахматный конь за один ход попасть из одного поля в другое?
5.Заданы координаты двух полей на шахматной доске: px1 py1 и px2 py2. Гарантируется (т.е. не надо это в программе проверять), что все...

Может ли шахматный конь за один ход попасть из одного поля в другое?
Заданы координаты двух полей на шахматной доске: px1 py1 и px2 py2. Гарантируется (т.е. не надо это в программе проверять), что все ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru