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

Найти число способов расставить на доске N на N ровно K магараджей

08.11.2019, 18:47. Показов 14685. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста решить задачку. Вот условие:
Магараджа — это шахматная фигура, сочетающая возможности ферзя и коня. Таким образом, магараджа может ходить и бить на любое количество клеток по диагонали, горизонтали и вертикали (т.е. как ферзь), а также либо на две клетки по горизонтали и на одну по вертикали, либо на одну по горизонтали и на две по вертикали (как конь). Ваша задача — найти число способов расставить на доске N на N ровно K магараджей так, чтобы они не били друг друга и отобразить каждый способ. Входные данные два целых числа: N и K (1 ≤ K ≤ N ≤ 10). Выходные данные выведите ответ на задачу в виде доски с расстановкой Магараджей.
Даже не представляю как ее решать
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2019, 18:47
Ответы с готовыми решениями:

Как на доске 10*10 расставить 10 мирных магараджей
(Решить методом перебора с возвратом) Магараджа – это фигура, которая объединяет в себе ходы коня и ферзя. Для доски 10*10 найти способ...

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

Число способов расставить на шахматной доске NxN K ладей так, чтобы они не били друг друга
Требуется найти число способов расставить на шахматной доске NxN K ладей так, чтобы они не били друг друга. Все ладьи считаются...

26
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
09.11.2019, 03:26
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int n, k, m[10];
 
void show() {for (int i=0; i<n; i++) if (m[i]>=0) cout<<char('a'+i)<<(m[i]+1)<<'\t'; cout<<'\n';}
 
bool tst(int i, int t, int p) {
    int x=i-p, y=t-m[p]; x*=x; y*=y;
    return t<0 || p==i || (m[p]<0 || y!=0 && x!=y && x+y!=5) && tst(i,t,p+1); }
 
void f(int i, int j) {
    if (i==n) { if (j==k) show(); return; }
    for (int t=-1; t<(j==k ? 0 : n); t++) if (tst(i,t,0)) { m[i]=t; f(i+1, j+(t>=0)); } }
 
int main() { cin >> n >> k; f(0, 0); }
Code
1
2
a2  b5  d1  e4
a4  b1  d5  e2
1
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 40
09.11.2019, 10:36  [ТС]
_Ivana, а какие надо библиотеки подключать, кроме iostream?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
09.11.2019, 13:46
Никакие. Цины/цауты только застдэшить по вкусу.
0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 40
09.11.2019, 13:50  [ТС]
_Ivana, да, я поняла уже)
А не подскажите ещё, вы какие значения N и K брали? А то я ввожу значения и там либо бесконечно выводится это поле, либо просто очень длинное, что мне кажется не реально
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
09.11.2019, 13:53
_Ivana, отвратительный говнокод.
Учитесь хорошему стилю!
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
09.11.2019, 14:02
Цитата Сообщение от LEVAN50 Посмотреть сообщение
что мне кажется не реально
А вы проверьте. Произвольные выдаваемые комбинации. Например в примере выше n=5 k=4 как не сложно догадаться. А если брать n с десяток и k около 5+-, тогда конечно вариантов будет немало. Но и в условии их надо вывести все

Kuzia domovenok, отвратительный комментарий. Учитесь хорошему стилю!
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
09.11.2019, 15:04
_Ivana, Но мне безо всякого негатива хотелось узнать, ты специально с codestyle подшаманил, чтобы новичок ничего не понял и завалил свой зачёт?
Или ты просто писал код без подлых мыслей, ну да - писал непонятный, но никакого желания "проучить студента" не испытывал?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
09.11.2019, 15:22
Интересный вопрос И вроде бы на него нельзя ответить "и то и другое", потому что предполагаются взаимоисключающие варианты. Поэтому отвечу так:

1. Разумеется, я испытывал подобное желание, и слегка подкрутил кота Хотя, мне кажется, что студент ничего бы не понял и без дополнительной обфускации, даже если написать максимально идиоматично. Это больше на преподавателя ориентировано, в предположении, что он не слепой и более вероятно в таком случае поймет, что кот студент писал не сам.

2. Даже если бы я не имел подобного желания, кот бы изменился не сильно. Ну может вместо булевской магии в паре мест тернарники бы использовал и все. А весь остальной кодстайл был бы тот же самый. Потому что такое у меня чувство прекрасного - краткое и однострочное
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
09.11.2019, 15:28
Цитата Сообщение от _Ivana Посмотреть сообщение
Даже если бы я не имел подобного желания, кот бы изменился не сильно.
вообще-то разница велика. Если даже студент не поймёт и нормальную программу(а не как у тебя), даже если вообще никакую программу не поймёт(!)

Не по теме:

(даже лучше если будет не в нормальном а намеренно школьно-студенческом стиле)


... так вот, его с нормальной прогой по крайней мере пропустит препод и поставит зачёт, потому как авось и не заподозрит, что прога списана. А то что ты написал - чистая подставуха.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
09.11.2019, 15:45
Kuzia domovenok, подставуха - это написать код совершенной другой задачи, незаметно захардкодив в него правильный ответ, предварительно рассчитанный для заданных входных данных. Но так я сделал только однажды. А остальные мои коты честно решают задачи, причем по возможности максимально эффективным образом. А что преподаватель поймет - надеюсь, что поймет, и не пропустит халяву. Хотя и преподы нередко проверяют не глядя.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
09.11.2019, 16:27
_Ivana, нет, то что ты сейчас сказал это не подставуха а просто невыполненная работа.Я говорю, что подло работу выполнить так, чтобы препод понял плагиаторство. Подленько так самомнение потешить своим (не спорю) талантом.


Короче, пойду я пока отсюда гулять, если вечером вернусь, обязательно идеальное школьное решение задачи сделаю, чтоб не пустословить тут.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
09.11.2019, 16:33
Kuzia domovenok, да я понял твою оценку моральной стороны вопроса еще с первого сообщения. Только я с ней не согласен, поэтому не разделяю твое отношение

ЗЫ ну и никто не мешает тебе самому писать котов, которые будут приниматься преподами халявщиков без подозрений.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
10.11.2019, 04:19
Лучший ответ Сообщение было отмечено LEVAN50 как решение

Решение

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
/*
Помогите пожалуйста решить задачку. Вот условие:
 
Магараджа — это шахматная фигура, сочетающая возможности ферзя и коня.
Таким образом, магараджа может ходить и бить на любое количество клеток
по диагонали, горизонтали и вертикали (т.е. как ферзь), а также либо на
две клетки по горизонтали и на одну по вертикали, либо на одну по
горизонтали и на две по вертикали (как конь). Ваша задача — найти число
способов расставить на доске N на N ровно K магараджей так, чтобы они не
 били друг друга и отобразить каждый способ. Входные данные два целых
числа: N и K (1 ≤ K ≤ N ≤ 10). Выходные данные выведите ответ на задачу в
 виде доски с расстановкой Магараджей.
 
Даже не представляю как ее решать*/
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
 
using namespace std;
int bsize, pieces;
class board {
    vector<int> hor=vector<int>(bsize, -1);//массив координат фигур. так как не может быть несколько фигур на одной горизонтали сохраняем только коорд.ы вертикалей фигур, соответствующие индексу масива hor[]
    vector<bool> ver = vector<bool>(bsize, false);//массив флагов "вертикаль занята"
    vector<bool> diag1 = vector<bool>(bsize*2, false);//массив флагов "диагональ / занята"
    vector<bool> diag2 = vector<bool>(bsize*2, false);/*диагональ \ */
    /*ставит фигуру в ряд:колонку, либо возвращает false если клетка под ударом*/
    bool try_put(int row, int col) {
        if (ver[col] || diag1[row + col] || diag2[row - col + bsize - 1])
            return false;//клетка под ударом если хоть 1 вертикаль/диагональ занята
        for (int i = 0; i < row; ++i)
            if (hor[i] >= 0 && abs(i - row) + abs(hor[i] - col) == 3)
                return false;//клетка под ударом, если верхние фигуры (с 0й по row-1ю) бьют её по лошадиному.
        //иначе клетка не под ударом. Ставим под удар все ряды, к которым она принадлежит.
        ver[col] = diag1[row + col] = diag2[row - col + bsize - 1] = true;
        hor[row] = col;
        return  true;
    }
    /**убирает фигуру из ряда:колонки*/
    void unput(int row, int col) {
        ver[col] = diag1[row + col] = diag2[row - col + bsize - 1] = false;//
        hor[row] = -1;
    }
public:
 
    bool print() {
        for (int i = 0; i < bsize; ++i) {
            for (int j = 0; j < bsize; ++j)
                if (j == hor[i])
                    cout << "M";
                else
                    cout << ".";
            cout << endl;
        }
        return true;
    }
    /*главная функция 
    row начиная с какого ряда расставлять
    pieces сколько фигур расставить всего
    */
    bool solve(int row, int pieces) {
        if (pieces==0)//если фигур не осталось - найдено решение
            return print();
        if (row == bsize - pieces)//если осталось больше фигур, чем рядов на доске - мы не на пути к решению
            return false;
        for (int col = 0; col<bsize; ++col) {//перебираем на какую колонку из ряда поставить фигуру
            if (try_put(row, col)) {
                //и если найдём такое место, будем искать место для следующей мхяджи на след. ряду
                if (solve(row + 1, pieces-1))
                    return true;
                unput(row, col);
            }
            else//впрочем, если не найдём, тоже попробуем пропустить этот ряд, у нас же фигур <= числа рядов.
                if (solve(row + 1, pieces))
                    return true;
        }
        return false;
    }
};
int main(int argc, char* argv[]) {
    if (argc != 3 || !(bsize = atoi(argv[1])) || !(pieces = atoi(argv[2])))
        return 1;//в командной строке должны быть 2 аргумента! размер доски и кол-во фигур.
    board b;
    if (!b.solve(0, pieces))
        cout << "no solution!";
    return 0;
}
1
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 40
10.11.2019, 21:27  [ТС]
Kuzia domovenok, скажите пожалуйста, а где вводятся значения bsize и pieces? Я этого в вашем коде не нашла(

Добавлено через 4 минуты
Kuzia domovenok, и почему программа не выводит решение?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
10.11.2019, 21:53
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
//в командной строке должны быть 2 аргумента! размер доски и кол-во фигур.
0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 40
10.11.2019, 21:58  [ТС]
Kuzia domovenok, это я понимаю, где эти аргументы нужно ввести с помощью cin? Или их как-то по-другому вводить нужно?
0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 40
11.11.2019, 08:38  [ТС]
Kuzia domovenok, мне программа не даёт ничего ввести в командную строку, окно сразу закрывается(
0
1 / 1 / 0
Регистрация: 16.10.2019
Сообщений: 40
11.11.2019, 11:36  [ТС]
Магараджа — это шахматная фигура, сочетающая возможности ферзя и коня. Таким образом, магараджа может ходить и бить на любое количество клеток по диагонали, горизонтали и вертикали (т.е. как ферзь), а также либо на две клетки по горизонтали и на одну по вертикали, либо на одну по горизонтали и на две по вертикали (как конь). Ваша задача — найти число способов расставить на доске N на N ровно K магараджей так, чтобы они не били друг друга и отобразить каждый способ. Входные данные два целых числа: N и K (1 ≤ K ≤ N ≤ 10). Выходные данные выведите ответ на задачу в виде доски с расстановкой Магараджей.
Вот код, но он почему-то не работает, помогите пожалуйста исправить
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
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
 
using namespace std;
int bsize, pieces;
class board {
    vector<int> hor=vector<int>(bsize, -1);
    vector<bool> ver = vector<bool>(bsize, false);
    vector<bool> diag1 = vector<bool>(bsize*2, false);
    vector<bool> diag2 = vector<bool>(bsize*2, false);
    
    bool try_put(int row, int col) {
        if (ver[col] || diag1[row + col] || diag2[row - col + bsize - 1])
            return false;
        for (int i = 0; i < row; ++i)
            if (hor[i] >= 0 && abs(i - row) + abs(hor[i] - col) == 3)
                return false;
        ver[col] = diag1[row + col] = diag2[row - col + bsize - 1] = true;
        hor[row] = col;
        return  true;
    }
    void unput(int row, int col) {
        ver[col] = diag1[row + col] = diag2[row - col + bsize - 1] = false;
        hor[row] = -1;
    }
public:
 
    bool print() {
        for (int i = 0; i < bsize; ++i) {
            for (int j = 0; j < bsize; ++j)
                if (j == hor[i])
                    cout << "M";
                else
                    cout << ".";
            cout << endl;
        }
        return true;
    }
 
    bool solve(int row, int pieces) {
        if (pieces==0)
            return print();
        if (row == bsize - pieces)
            return false;
        for (int col = 0; col<bsize; ++col) {
            if (try_put(row, col)) {
               
                if (solve(row + 1, pieces-1))
                    return true;
                unput(row, col);
            }
            else
                if (solve(row + 1, pieces))
                    return true;
        }
        return false;
    }
};
int main(int argc, char* argv[]) {
    if (argc != 3 || !(bsize = atoi(argv[1])) || !(pieces = atoi(argv[2])))
        return 1;/
    board b;
    if (!b.solve(0, pieces))
        cout << "no solution!";
    return 0;
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
13.11.2019, 02:10
Смотри на строки 62 63
число мажажажей и размер доски задаются в командной строке.
Не нравится командная строка убери argv, - введи через cout. Можешь вообще приравнять им константные числа.
Вообще, нужно немного разбираться в С++, а не тупо копипастить, что дают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2019, 02:10
Помогаю со студенческими работами здесь

Расставить на доске максимальное число ферзей так, чтобы каждый из них нападал ровно на р ферзей
3. Расставить на доске N×N максимальное число ферзей так, чтобы каждый из них нападал ровно на р (р&lt;=2) ферзей. Совсем не...

Сколько существует способов расставить на шахматной доске две ладьи?
Сколько существует способов расставить на шахматной доске две ладьи, чтобы они не &quot;били&quot; друг друга? Объясните, пожалуйста,...

Найти количество способов расставить книги
Помогите пожалуйста решить задачу: В начале учебного года в одном Великом Университете библиотека выдавала книги своим студентам,...

Расставить на доске N ферзей так, чтобы наибольшее число ее полей оказалось вне боя ферзей
1.Расставить на доске N×N (N&lt;=12) N ферзей так, чтобы наибольшее число ее полей оказалось вне боя ферзей. Ферзи при этом могут «бить» друг...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru