Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
marymap
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 75
#1

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

06.03.2017, 13:44. Просмотров 364. Ответов 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;
}

http://www.cyberforum.ru/cpp-beginners/thread1933091.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2017, 13:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Определить поля в которые может попасть конь за n ходов из указанной позиции (C++):

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

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

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

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

Определить может ли конь попасть с первой клетки на вторую одним ходом?
Добрый день. Задача: Шахматный конь ходит буквой “Г” — на две клетки по...

4
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
06.03.2017, 21:43 #2
Лучший ответ Сообщение было отмечено 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
marymap
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 75
06.03.2017, 22:27  [ТС] #3
вот,что у меня получилось.
не знаю, стоит ли создавать еще одну функцию, чтобы не было подряд 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
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
06.03.2017, 22:40 #4
Цитата Сообщение от marymap Посмотреть сообщение
чтобы не было подряд 8 if
Использовать цикл.
0
marymap
2 / 2 / 1
Регистрация: 28.11.2016
Сообщений: 75
06.03.2017, 22:55  [ТС] #5
готовая
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
06.03.2017, 22:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2017, 22:55
Привет! Вот еще темы с решениями:

Какое наименьшее количество ходов должен сделать конь, чтобы попасть на заданную клетку
На шахматной доске NxN в клетке (x1, y1) стоит голодный шахматный конь. Он...

Определить, может ли конь за один ход перейти с одного поля на другое
С++ Даны координаты (целые от 1 до 8) двух полей шахматной доски. Определить,...

Попасть шахматным конем в заданную клетку поля за наименьшее число ходов
На шахматной доске NxN в клетке (x1, y1) стоит голодный шахматный конь. Он...

На доске стоят два ферзя. Указать поля, на которые может пойти белый ферзь, чтобы не попасть под удар черного
ПОМОГИТЕ ПОЖАЛУЙСТА!!!!! :wall: Поле шахматной доски задается парой...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru