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

Ходы ферзя

04.10.2020, 00:01. Показов 1727. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программе задаётся доска типа

........
........
........
........
....F...
........
........
........

Тут надо отметить знаками '!' все ходы доступные ферзю, например

!...!...
.!..!..!
..!.!.!.
...!!!..
!!!!F!!!
...!!!..
..!.!.!.
.!..!..!

И вот я написал код, но третий while, почему руинит, я так удалял по каждому куску и смотрел, и вот из-за него происходит ошибка, но я не пойму что не так.

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
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    int l, r;
    string x;
    vector<string> a(8);
    for (int i = 0; i < 8; i++)
    {
        cin >> x;
        a[i] = x;
        for (int j = 0; j < 8; j++)
        {
            if (x[j] == 'F')
            {
                l = i;
                r = j;
            }
        }
    }
    for (int i = 0; i < 8; i++)
        a[l][i] = '!';
    for (int i = 0; i < 8; i++)
        a[i][r] = '!';
    int i = l+1, j = r+1;
    while (i <= 7 || j <= 7)
    {
        a[i++][j++] = '!';
    }
    i = l-1, j = r-1;
    while (i >= 0 || j >= 0)
    {
        a[i--][j--] = '!';
    }
    i = l+1, j = r-1;
    while (i <= 7 || j >= 0)
    {
        a[i++][j--] = '!';
    }
    i = l-1, j = r+1;
    while (i >= 0 || j <= 7)
    {
        a[i--][j++] = '!';
    }
 
    a[l][r] = 'F';
    for (int i = 0; i < 8; i++)
        cout << a[i] << endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2020, 00:01
Ответы с готовыми решениями:

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

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

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

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

3
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
04.10.2020, 01:21 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//g++  7.4.0
 
#include <iostream>
#include <vector>
#include <string>
 
 
using std::endl;
using std::cin;
using std::cout;
using std::vector;
using std::string;
using std::pair;
 
void chekDiag(vector<string> & board, pair<int,int> & queen, char makeSynb)
{
    size_t vn = board.size();
    size_t sn = board[0].size();
    int row = queen.first+1, col=queen.second+1;
    while(row<vn && col<sn)
       board[row++][col++] =  makeSynb;
    row = queen.first-1; col=queen.second-1;
    while(row>=0 && col>=0)
       board[row--][col--] =  makeSynb;
    row = queen.first-1; col=queen.second+1;
    while(row>=0 && col<sn)
       board[row--][col++] =  makeSynb;
    row = queen.first+1; col=queen.second-1;
    while(row<vn && col>=0)
       board[row++][col--] =  makeSynb;
     
}
void chekStraight(vector<string> & board, pair<int,int> & queen, char makeSynb)
{
    size_t vn = board.size();
    size_t sn = board[0].size();
    int row = queen.first, col=queen.second+1;
    while(col<sn)
       board[row][col++] =  makeSynb;
    row = queen.first+1; col=queen.second;
    while(row<vn)
       board[row++][col] =  makeSynb;
    row = queen.first-1; col=queen.second;
    while(row>=0)
       board[row--][col] =  makeSynb;
    row = queen.first; col=queen.second-1;
    while(col>=0)
       board[row][col--] =  makeSynb;
}
 
int main()
{
    pair<int, int> queen(5,5);
    vector<string> board(8, "........");
    board[queen.first][queen.second] = 'F';
    
    chekDiag(board, queen, '!');
    chekStraight(board, queen, '!');
    for(auto line : board)
        cout<<line<<endl;
    return 0;
}
Добавлено через 3 минуты
chekDiag - для слона
chekStraight - для ладьи
вместе - ферзь )
0
11 / 10 / 5
Регистрация: 25.07.2020
Сообщений: 302
04.10.2020, 18:57  [ТС] 3
SmallEvil, не могу понять что не так у меня в цикле while третьем

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

Добавлено через 3 часа 20 минут
Ну реально, что там не так? в циклах while нарушается условие и i может выйти за границу и стать равным 8, или и j может выйти, я не могу понять как так??

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<iterator>
int main(){
    int n=0,k;  
    auto it=std::istream_iterator<char>(std::cin);
    for(;n<64 && *it!='F';++n)  ++it;
    k=n%8;
    n/=8;
    for(int i=0;i<8;++i){
        for(int j=0;j<8;++j)
            std::cout<<(i==n && j==k ? 'F' : i==n || j==k || n-i==k-j || n-i==j-k  ? '!' : '.'); 
        std::cout<<'\n';
    }
            
    return 0;
}
вот это вообще не понятно как челове решил, я в шоке

Добавлено через 20 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<iterator>
int main(){
    int n=0,k;  
    auto it=std::istream_iterator<char>(std::cin);
    for(;n<64 && *it!='F';++n)  ++it;
    k=n%8;
    n/=8;
    for(int i=0;i<8;++i){
        for(int j=0;j<8;++j)
            std::cout<<(i==n && j==k ? 'F' : i==n || j==k || n-i==k-j || n-i==j-k  ? '!' : '.'); 
        std::cout<<'\n';
    }
            
    return 0;
}
вот это вообще не понятно как челове решил, я в шоке
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
05.10.2020, 07:00 4
Jorka, можнт не ваше,

Добавлено через 1 минуту
Цитата Сообщение от Jorka Посмотреть сообщение
for(int i=0;i<8;++i){ for(int j=0;j<8;++j) std::cout<<(i==n && j==k ? 'F' : i==n || j==k || n-i==k-j || n-i==j-k ? '!' : '.'); std::cout<<'\n'; }
это не решеентн - кодерство тупое

Добавлено через 56 минут
Цитата Сообщение от Jorka Посмотреть сообщение
что не так у меня в
0
05.10.2020, 07:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2020, 07:00
Помогаю со студенческими работами здесь

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

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

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

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

Раскрасить шахматную доску в соответствии с позицией ферзя
Помогите доделать задачу, криво выводится: Дана строка из двух символов , первый - латинская...

Шахматы. Каждый ферзь бьет ровного одного ферзя
Всем привет! Помогите решить задачу: Расставить на шахматной доске максимальное число ферзей так,...


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

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