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

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

08.11.2019, 18:47. Показов 14830. Ответов 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,991
Записей в блоге: 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,991
Записей в блоге: 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,536
Записей в блоге: 1
09.11.2019, 13:53
_Ivana, отвратительный говнокод.
Учитесь хорошему стилю!
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 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,536
Записей в блоге: 1
09.11.2019, 15:04
_Ivana, Но мне безо всякого негатива хотелось узнать, ты специально с codestyle подшаманил, чтобы новичок ничего не понял и завалил свой зачёт?
Или ты просто писал код без подлых мыслей, ну да - писал непонятный, но никакого желания "проучить студента" не испытывал?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
09.11.2019, 15:22
Интересный вопрос И вроде бы на него нельзя ответить "и то и другое", потому что предполагаются взаимоисключающие варианты. Поэтому отвечу так:

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

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

Не по теме:

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


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


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

ЗЫ ну и никто не мешает тебе самому писать котов, которые будут приниматься преподами халявщиков без подозрений.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 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,536
Записей в блоге: 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,536
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru