Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/47: Рейтинг темы: голосов - 47, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110

Шахматный конь

27.05.2019, 21:13. Показов 10470. Ответов 31

Студворк — интернет-сервис помощи студентам
Добрый день
Нужно поправить код, но не знаю как.

Такая задача:
Одно движение шахматного прыгуна (лошади) - это прыжок на два поля вертикально или горизонтально, а затем на один квадрат под прямым углом. Такое движение создает букву «Л». Все поля, доступные одним движением перемычки, отмечены крестиком на диаграмме ниже.
Рассмотрим неограниченную шахматную доску, на которой стоит несколько перемычек и на которой выделено одинаковое количество целевых полей. После выполнения определенного количества ходов (описанных выше) перемычки должны находиться на целевых полях. Как это сделать, выполнив минимальное количество ходов? Задача Напишите программу, которая для заданного распределения выходных N перемычек и N целевых полей найдет минимальное количество ходов, после которого перемычки окажутся на целевых полях.
Входные данные В первой строке стандартного ввода содержится целое число D (1 ≤D ≤ 20), обозначающее количество наборов данных, размещенных в следующих строках. Каждый набор состоит из строки, содержащей количество N перемычек (1≤N≤ 1000), и из следующих 2N строк, содержащих координаты выходных полей перемычек (N строк), а затем расположение целевых полей (следующие N строк). Каждая из 2N строк, содержащих координаты поля (выходной или целевой), содержит две, разделенные одним пробелом целые числа x, y (-2000000000≤x, y ≤ 2 000 000 000), обозначающие номера столбца и строки, соответственно, на пересечении какого поля. Выходные данные Стандартный выходной файл должен содержать D задач для последующих наборов данных. Каждое решение должно быть записано в одну строку, в которой должно быть одно положительное целое число K - обозначающее минимальное количество движений, необходимое для перемещения всех перемычек из начальной позиции в целевую позицию.

//4
//1
//5 5
//5 6
//2
//0 0
//1 0
//0 1
//1 1
//13
//4 1
//4 2
//3 3
//0 7
//4 3
//6 1
//3 5
//6 3
//5 4
//2 7
//3 7
//5 6
//7 5
//1 1
//3 0
//4 0
//1 4
//3 2
//0 7
//3 5
//7 3
//6 6
//7 5
//5 7
//7 6
//6 7
//15
//0 0
//0 1
//1 1
//2 0
//0 3
//3 3
//5 2
//7 0
//1 7
//3 6
//6 4
//7 4
//7 5
//6 7
//7 7
//1 1
//0 3
//4 0
//3 2
//2 3
//6 1
//0 7
//1 6
//3 5
//5 3
//4 4
//7 3
//4 7
//5 7
//7 7
правильный ответ:
//3
//4
//18
//24



Полазил по Гуглу, по изучал информацию и получилось сделать только для стандартной доски 8х8(решил начать с простого и дойти со временем до решения).

У меня не получается сделать неограниченную шахматную доску.
А как сделать это что-то не придумаю?

Если можете помочь, был бы очень благодарен вам)

Вот мой код:

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
#include "pch.h"
#include <iostream>
#include <map>
#include <queue>
#include <climits>
using namespace std;
 
#define N 8
 
//8 возможных движений для коня
int row[] = { 2, 2, -2, -2, 1, 1, -1, -1 };
int col[] = { -1, 1, 1, -1, 2, -2, 2, -2 };
 
// Проверяем, верны ли (x, y) координаты шахматной доски
bool valid(int x, int y)
{
    if (x < 0 || y < 0 || x >= N || y >= N)
        return false;
 
    return true;
}
 
 
struct Node
{
    // (x, y) представляет координаты шахматной доски
    //dist представляет минимальное расстояние от источника
    int x, y, dist;
 
    //конструктор
    Node(int x, int y, int dist = 0) : x(x), y(y), dist(dist) {}
 
    
 
    bool operator<(const Node& o) const
    {
        return x < o.x || (x == o.x && y < o.y);
    }
};
 
// Находим минимальное количество шагов для коня
int BFS(Node src, Node dest)
{
    // карта, чтобы проверить, посещалась ли ячейка матрицы раньше или нет
    map<Node, bool> visited;
 
    // создаем очередь, и ставим в первый узел
    queue<Node> q;
    q.push(src);
 
    // запускать до тех пор, пока очередь не станет пустой
    while (!q.empty())
    {
        // извлекаем передний узел из очереди и обрабатываем его
        Node node = q.front();
        q.pop();
 
        int x = node.x;
        int y = node.y;
        int dist = node.dist;
 
        // если пункт назначения достигнут, вернуть расстояние
        if (x == dest.x && y == dest.y)
            return dist;
 
        // Пропустить, если местоположение посещалось раньше
        if (!visited.count(node))
        {
            // пометить текущий узел как посещенный
            visited[node] = true;
 
            // проверяем все 8 возможных движений коня
            // и ставим каждое правильное движение в очередь
            for (int i = 0; i < 8; ++i)
            {
                // Получить новую действительную позицию рыцаря из текущей
                // позиция на шахматной доске и поставить ее в очередь
                //  +1 расстоянием
                int x1 = x + row[i];
                int y1 = y + col[i];
 
                if (valid(x1, y1))
                    q.push({ x1, y1, dist + 1 });
            }
        }
    }
 
    // вернуть бесконечность, если путь не возможен
    return INT_MAX;
}
 
 
int main()
{
    // исходные координаты
    Node src = { 1, 0 };
 
    // координаты пункта назначения
    Node dest = { 1, 1 };
 
    cout<<BFS(src, dest);
 
    return 0;
}
Добавлено через 1 час 45 минут
Ну очееень нужно)))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2019, 21:13
Ответы с готовыми решениями:

Шахматная доска и шахматный конь
Добрый день. Дана вот такая задачка... Дана шахматная доска размером 8х8 и шахматный конь. Программа должна запросить у пользователя...

Может ли шахматный конь перейти в указанную клетку доски?
Собственно условие такое, задаются начальные и конечные координаты от 1 до 8 (шахматная доска). И если шахматная фигура конь может так...

Проверить не угрожает ли данный шахматный конь заданному полю
Поле шахматной доски имеет размер 8 x 8. Клетки обозначены координатами, первая - номер по вертикале (слева на право),вторая - номер по...

31
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
27.05.2019, 22:42  [ТС]
Студворк — интернет-сервис помощи студентам
Неа никак
даже не отвечает

Добавлено через 4 минуты
Для этих координат выдает результат 3, а должно быть 2
// исходные координаты
Node src = { 0, 1 };

// координаты пункта назначения
Node dest = { 1, 1 };

Для этих координат программа запускается и ничего не выдаёт

Добавлено через 26 секунд
// исходные координаты
Node src = { 0, 0 };

// координаты пункта назначения
Node dest = { 0, 1 };

Добавлено через 6 минут
И как теперь быть?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2019, 22:44
Цитата Сообщение от Programist_r Посмотреть сообщение
if (row[i] < 0 ? x > abs(row[i]) : x < INT_MAX - row[i])
Добавь-ка скобки : (x < INT_MAX - row[i])), для y тоже

Добавлено через 1 минуту
Даже (x < (INT_MAX - row[i]))
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
27.05.2019, 22:48  [ТС]
тоже самое

Добавлено через 1 минуту
(x < (INT_MAX - row[i]))

Для этого тоже самое

Добавлено через 46 секунд
Может нужно что-то прописать для координат 0;0 ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2019, 22:51
Цитата Сообщение от Programist_r Посмотреть сообщение
тоже самое
Ну, проблема либо в этих условиях - проверь, что они правильные, либо в чем-то другом, что менее вероятно

Добавлено через 1 минуту
Цитата Сообщение от Programist_r Посмотреть сообщение
Может нужно что-то прописать для координат 0;0 ?
Возможно. Это граничные условия, я тупо не могу их сходу сформулировать правильно
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
27.05.2019, 22:51  [ТС]
А для n может что-то прописать?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2019, 22:53
На идея вроде правильная

Добавлено через 1 минуту
Цитата Сообщение от Programist_r Посмотреть сообщение
А для n может что-то прописать?
Зачем, у тебя безграничная доска INT_MAX и есть N

Добавлено через 56 секунд
Единственная разница, ты прибавить к нему ничего не можешь, будет переполнение
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
27.05.2019, 22:56  [ТС]
Ясно

Добавлено через 49 секунд
Попробую что-то сделать

Добавлено через 1 минуту
Всё равно спасибо
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2019, 23:07
Цитата Сообщение от Programist_r Посмотреть сообщение
Попробую что-то сделать
Там, насколько я понимаю, осталось совсем не
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Зачем, у тебя безграничная доска INT_MAX и есть N
А верни к первоначальному коду и пропиши вместо #define N
C++
1
static const int N = INT_MAX / 2;
Сойдёт за бесконечную доску
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
28.05.2019, 19:27  [ТС]
Показывает тот же результат, что и был из самого начала
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2019, 19:30
Цитата Сообщение от Programist_r Посмотреть сообщение
Показывает тот же результат, что и был из самого начала
Т.е. работает правильно?
0
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 110
28.05.2019, 19:37  [ТС]
Работает то правильно
Но должно быть во втором наборе ответ 4 для двух коней, а ответ получается 6(3 хода для одного коня и 3 хода для второго)

Добавлено через 1 минуту
Ходить должны как-то так:


Расстановка для второго случая:
Код:

3! 0 0 0 0 0
2! 0 0 0 0 0
1! 0 h 0 0 0
0! 0 h 0 0 0
-1! 0 0 0 0 0
-2! 0 0 0 0 0
----------------
-1 0 2 3 4

Первый ход каждого коня:
Код:

3! 0 0 0 0 0
2! 0 0 0 1 0
1! 0 h 0 0 0
0! 0 h 0 0 0
-1! 0 0 0 1 0
-2! 0 0 0 0 0
----------------
-1 0 2 3 4

Второй ход каждого коня:
Код:

3! 0 0 0 0 0
2! 0 0 0 1 0
1! 0 h 2 0 0
0! 0 h 2 0 0
-1! 0 0 0 1 0
-2! 0 0 0 0 0
----------------
-1 0 2 3 4

Итого - 4 хода.

Вход
//2
//0 0
//1 0
//0 1
//1 1

Виход
4
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2019, 19:40
Цитата Сообщение от Programist_r Посмотреть сообщение
Но должно быть во втором наборе ответ 4 для двух коней, а ответ получается 6(3 хода для одного коня и 3 хода для второго)
Смотри тогда свой алгоритм (тут я мало чем могу помочь).
Бесконечное поле - оно по-любому не бесконечное, достаточно сделать такое, чтоб твои операции не приводили к переполнению.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2019, 19:40

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

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

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

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

Выясните, может шахматный конь за один ход попасть с ячейки с координатами (x1, y1) в ячейку с координатами (x2, y2)
4.Выясните, может шахматный конь за один ход попасть с ячейки с координатами (x1, y1) в ячейку с координатами (x2, y2).


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. Сразу отвечу: А в PvP с ним. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru