С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 07.04.2022
Сообщений: 11
1

Ходы ферзя

25.04.2022, 19:52. Показов 6390. Ответов 10

Author24 — интернет-сервис помощи студентам
Здравствуйте, возникла проблема с такой задачей:
На шахматной доске стоит ферзь. Отметьте положение ферзя на доске и все клетки, которые бьет ферзь. Клетку, где стоит ферзь, отметьте буквой "Q", клетки, которые бьет ферзь, отметьте символами "*", остальные клетки заполните точками.

Входные данные

В двух строках входного файла заданы два числа — координаты нахождения ферзя. Числа во входном файле натуральные, не превосходящие 8 по значению.

Выходные данные

Выведите на экран изображение доски так, как это показано в примере. Обратите внимание, что символы в одной строке разделены пробелом.

Пример:
Ввод: 4 2
Вывод:
. * . . * . . .
. * . * . . . .
* * * . . . . .
* Q * * * * * *
* * * . . . . .
. * . * . . . .
. * . . * . . .
. * . . . * . .

Вот моё решение (код, вроде как, работает правильно, но слишком долго):
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <string>
using namespace std;
int main()
{
    char d[8][16];
    for(int i=0;i<=7;i++)
    {
        for(int j=0;j<=15;j++)
        {
            if (j%2==0)
            {
                d[i][j]='.';
            }
            else{
                d[i][j]=' ';
            }
        }
    }
    char d2[8][16];
    for(int i=0;i<=7;i++)
    {
        for(int j=0;j<=15;j++)
        {
            if (j%2==0)
            {
                d2[i][j]='.';
            }
            else{
                d2[i][j]=' ';
            }
        }
    }
    int a,b;
    cin>>a>>b;
    
    if (a+b<=9)
    {
        d2[0][a+b+a+b-4]='*';
        for(int i=0;i<=7;i++)
        {
            for(int j=0;j<=14;j++)
            {
                if (d2[i-1][j+2]=='*')
                {
                    d2[i][j]='*';
                }
                if (d2[i][14]=='*' and i>0)
                {
                    d2[i][14]='.';
                }
            }
        }
    }
 
    if (a+b>9)
    {
        d2[a+b-9][14]='*';
        for(int i=0;i<=7;i++)
        {
            for(int j=0;j<=14;j++)
            {
                if (d2[i-1][j+2]=='*')
                {
                    d2[i][j]='*';
                }
                if (d2[7][j]=='*')
                {
                    break;
                }
            }
        }
    }
 
    if (a>b)
    {
        d[max(a,b)-min(a,b)][0]='*';
        for(int i=0;i<=7;i++)
        {
            for(int j=0;j<=14;j++)
            {
                if (d[i-1][j-2]=='*')
                {
                    d[i][j]='*';
                }
            }
        }
    }
 
    if (a<=b)
    {
        d[0][max(a,b)+max(a,b)-min(a,b)-min(a,b)]='*';
        for(int i=0;i<=8-b+a;i++)
        {
            for(int j=0;j<=14;j++)
            {
                if (d[i-1][j-2]=='*')
                {
                    d[i][j]='*';
                }
            }
        }
    }
 
    for(int i=0;i<=7;i++)
    {
        for(int j=0;j<=14;j++)
        {
            if (d[i][j]=='.' and d2[i][j]=='*')
            {
                d[i][j]='*';
            }
        }
    }
 
    for(int i=0;i<=7;i++)
    {
        d[i][b+b-2]='*';
    }
 
    for(int j=0;j<=14;j++)
    {
        if (j%2==0)
        {
            d[a-1][j]='*';
        }
    }
    
    d[a-1][b+b-2]='Q';
    for(int i=0;i<=7;i++)
    {
        for(int j=0;j<=14;j++)
        {
            cout<<d[i][j];
        }
        cout<<endl;
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2022, 19:52
Ответы с готовыми решениями:

Ходы ферзя
Программе задаётся доска типа ........ ........ ........ ........ ....F... ...........

Ходы ферзём
На шахматной доске стоит ферзь. Отметьте положение ферзя на доске и все клетки, которые бьет ферзь....

Ходы конем
На шахматной доске стоит конь. Отметьте положение коня на доске и все клетки, которые бьет конь....

Ходы Коня -2
Ходы коня — 2 Конь находится на шахматной доске 8×8. Определите координаты всех клеток, куда...

Сделать ферзя
Надо сделать ферзя и выделить клетки которые у него по боем, , по сути я не могу вычислить алгоритм...

10
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
25.04.2022, 22:28 2
Лучший ответ Сообщение было отмечено digon как решение

Решение

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
#include <iostream>
#include <string>
int main()
{
    char desk[8][8];
    short int I,J;
    do{
        std::cin >> I >> J;std::cin.get();
    }while(I>8||J>8||I<1||J<1);
    I--;J--;
    for(short int i = 0;i<8;i++)
    {
    for(short int j = 0;j<8;j++)
    {
        if(j==J&&i==I)
        desk[I][J]='Q';
        else
        if(i+j==J+I||i+J==j+I||i==I||j==J)
        desk[i][j]='*';
        else
        desk[i][j]='.';
        std::cout<<desk[i][j]<<' ';
    }
    std::cout<<'\n';}
    std::cin.get();
}
1
1 / 1 / 0
Регистрация: 07.04.2022
Сообщений: 11
26.04.2022, 18:33  [ТС] 3
Немного подправил код выше (он выводил доску с ферзём не в заданных координатах)
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
#include <iostream>
#include <string>
using namespace std;
int main()
{
    char desk[8][8];
    int I,J,a,b;
    cin >> a >> b;
    I=a-1,J=b-1;
    for(int i = 0;i<8;i++)
    {
    for(int j = 0;j<8;j++)
    {
        if(j==J&&i==I)
        desk[I][J]='Q';
        else
        if(i+j==J+I||i+J==j+I||i==I||j==J)
        desk[i][j]='*';
        else
        desk[i][j]='.';
        cout<<desk[i][j]<<' ';
    }
    cout<<'\n';}
}
1
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
26.04.2022, 23:53 4
digon,
Цитата Сообщение от digon Посмотреть сообщение
C++
1
2
3
int I,J,a,b;
    cin >> a >> b;
    I=a-1,J=b-1;
если изменение заключается в этом, то вы ничего не поменяли, кроме того что убрали проверку на правильность введённых данных и паузу в конце программы.
0
1 / 1 / 0
Регистрация: 07.04.2022
Сообщений: 11
27.04.2022, 08:57  [ТС] 5
programmer_08, ну фактически да, изменений по сути нет.
0
1 / 1 / 1
Регистрация: 23.06.2024
Сообщений: 7
28.06.2024, 14:23 6
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
#include <iostream>
#include <vector>
 
using namespace std;
 
 
int main()
{
    int x, y;
    cin >> x >> y;
    std::vector<std::vector<char>> t(9, std::vector<char>(9, '.'));
    t[x][y] = 'Q';
 
 
    int i = 1;
    while (x - i > 0 && y - i > 0) {
        t[x - i][y - i] = '*';
        ++i;
    }
 
    i = 1;
    while (x + i < 9 && y + i < 9) {
        t[x + i][y + i] = '*';
        ++i;
    }
 
    i = 1;
    while (x - i > 0 && y + i < 9) {
        t[x - i][y + i] = '*';
        ++i;
    }
    i = 1;
    while (x + i < 9 && y - i > 0) {
        t[x + i][y - i] = '*';
        ++i;
    }
 
    i = 1;
    while (x - i > 0) {
        t[x - i][y] = '*';
        ++i;
    }
 
    i = 1;
    while (x + i < 9) {
        t[x + i][y] = '*';
        ++i;
    }
 
    i = 1;
    while (y - i > 0) {
        t[x][y - i] = '*';
        ++i;
    }
 
    i = 1;
    while (y + i < 9) {
        t[x][y + i] = '*';
        ++i;
    }
 
 
    for (int i = 1; i <= 8; ++i) {
        for (int j = 1; j <= 8; ++j) {
            cout << t[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
0
Эксперт функциональных языков программированияЭксперт С++
4170 / 2000 / 961
Регистрация: 01.06.2021
Сообщений: 7,056
Записей в блоге: 6
28.06.2024, 23:36 7
Цитата Сообщение от Kivik Посмотреть сообщение
std::vector<char>
можно использовать string
0
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
29.06.2024, 00:02 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main() {
    const auto abs = [](int x) { return x >= 0 ? x : -x; };
    constexpr const int boardSize = 8;
    int queenRow, queenCol;
    std::cin >> queenRow >> queenCol;
    for (int row = 1; row <= boardSize; row++) {
        for (int col = 1; col <= boardSize; col++) {
            int deltaRow = abs(queenRow - row);
            int deltaCol = abs(queenCol - col);
            if (deltaRow == 0 && deltaCol == 0)
                std::cout << "Q ";
            else if (deltaRow * deltaCol == 0 || deltaRow == deltaCol)
                std::cout << "* ";
            else
                std::cout << ". ";
        }
        std::cout << "\n";
    }
}
1
537 / 327 / 169
Регистрация: 21.02.2011
Сообщений: 4,983
04.07.2024, 12:45 9
через vector
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
#include <iostream>
#include <vector>
 
int main() {
    std::vector<std::vector<char>> board(8, std::vector<char>(8, '.'));
 
    int x, y;
    std::cin >> x >> y;
 
    for (int i = 0; i < 8; ++i) {
        board[y-1][i] = '*';
        board[i][x-1] = '*';
        if (y-1-i >= 0 && x-1-i >= 0) board[y-1-i][x-1-i] = '*';
        if (y-1+i < 8 && x-1+i < 8) board[y-1+i][x-1+i] = '*';
        if (y-1-i >=0 && x-1+i < 8) board[y-1-i][x-1+i] = '*';
        if (y-1+i < 8 && x-1-i >= 0) board[y-1+i][x-1-i] = '*';
    }
 
    board[y-1][x-1] = 'Q';
 
    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            std::cout << board[i][j] << " ";
        }
        std::cout << std::endl;
    }
 
    return 0;
}
0
Эксперт функциональных языков программированияЭксперт С++
4170 / 2000 / 961
Регистрация: 01.06.2021
Сообщений: 7,056
Записей в блоге: 6
04.07.2024, 12:59 10
andreyfreelans, не вижу никаких преимуществ у vector для данной задачи, когда размер доски известен.
0
3718 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
04.07.2024, 13:10 11
Royal_X, ну мало кто знает что есть std::array
0
04.07.2024, 13:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2024, 13:10
Помогаю со студенческими работами здесь

Ходы шахматного коня
Задача заключается в том, чтобы найти минимальное количество ходов для перехода шахматного коня с...

задача о расположении ферзя
Шахматную доску будем представлять символьной матрицей, размером 8х8. Даны натуральные числа n и m...

Обозначение ходов ферзя
Здравствуйте,подкиньте плиз способ как обозначить звездочкой в символьном массиве 8на8 ходы...

Найти доступные ходы для пользователя
Пишу простую консольную игру на C++. Углубляться в правила не буду, расскажу о проблеме. Игровая...

Шахматы. Подскажите, как написать ферзя.
Задача. Вводим фигуру-напр, ферзь и ее координаты. И вводим координаты второй фигуры. Нужно...

Определить все ходы для белой шашки.
Вот сижу и думаю как эту рекурсию использовать и в каком месте.Что это такое я интуитивно...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru