Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 Два ферзя и две ладьи на доске
Расставьте на доске $6\times 6$ два ферзя и две ладьи так, чтобы они не били друг друга, но все остальные поля доски оказались под боем.

 Re: Два ферзя и две ладьи на доске
Можно.

 Re: Два ферзя и две ладьи на доске
wrest
А теперь возникает ещё один любопытный вопрос: сколько вообще существует таких расстановок, если не считать различными варианты, получающиеся друг из друга поворотами и отражениями доски?

 Re: Два ферзя и две ладьи на доске
Изображение

 Re: Два ферзя и две ладьи на доске

(Оффтоп)

4-ый вариант - проверка внимания? :-)

 Re: Два ферзя и две ладьи на доске
Аватара пользователя

(Оффтоп)

Нет, это не проверка, а намёк на то, что решение получено вручную. АИ небитое d5 не пропустил бы!

 Re: Два ферзя и две ладьи на доске
A_I в сообщении #1736870 писал(а):
4-ый вариант - проверка внимания?

А, да, там ферзю надо влево на одно поле походить.

 Re: Два ферзя и две ладьи на доске
gris в сообщении #1736871 писал(а):
Нет, это не проверка, а намёк на то, что решение получено вручную. АИ небитое d5 не пропустил бы!
Нарисовано вручную человеком. С выдачи MiniZinc по коду, написанному ChatGPT. Например. Да, 15 решений.

(Код бесплатного ChatGPT)

Код:
include "globals.mzn";

array[1..4] of var 1..6: x;
array[1..4] of var 1..6: y;

array[1..4] of bool: q = [true, true, false, false];

% No two pieces attack each other
constraint forall(i,j in 1..4 where i < j) (
    x[i] != x[j] /\ y[i] != y[j] /\
    (q[i] \/ q[j] ->
        abs(x[i]-x[j]) != abs(y[i]-y[j]))
);

% Every empty square is attacked
constraint forall(c,r in 1..6) (
    exists(i in 1..4)(x[i]=c /\ y[i]=r) \/
    exists(i in 1..4)(
        x[i]=c \/ y[i]=r \/
        (q[i] /\ abs(x[i]-c)=abs(y[i]-r))
    )
);

% Square content: 0=empty, 1=queen, 2=rook
function var int: cell(var int: c, var int: r) =
    sum(i in 1..4)(
        if x[i]=c /\ y[i]=r then
            if q[i] then 1 else 2 endif
        else 0 endif
    );

% Board in row-major order
array[1..36] of var int: board =
    [cell(c,r) | r in 1..6, c in 1..6];

% Lexicographic comparison
predicate my_lex_leq(
    array[1..36] of var int: a,
    array[1..36] of var int: b
) =
    exists(k in 1..36)(
        forall(j in 1..k-1)(a[j]=b[j]) /\
        a[k] < b[k]
    ) \/ forall(j in 1..36)(a[j]=b[j]);

% Exclude all seven non-identity symmetries
constraint forall(t in 1..7)(
    my_lex_leq(board, [
        cell(
            if t=1 then 7-c
            elseif t=2 then 7-c
            elseif t=3 then c
            elseif t=4 then r
            elseif t=5 then 7-r
            elseif t=6 then r
            else 7-r endif,
            if t=1 then r
            elseif t=2 then 7-r
            elseif t=3 then 7-r
            elseif t=4 then 7-c
            elseif t=5 then c
            elseif t=6 then c
            else 7-c endif
        )
        | r in 1..6, c in 1..6
    ])
);

% Remove permutations of identical pieces
constraint x[1] < x[2] \/
    (x[1]=x[2] /\ y[1]<y[2]);

constraint x[3] < x[4] \/
    (x[3]=x[4] /\ y[3]<y[4]);

solve satisfy;

output [
    concat([
        if q[i] then "Q" else "R" endif ++
        show(x[i]) ++ show(y[i]) ++ " "
        | i in 1..4
    ])
];

 Re: Два ферзя и две ладьи на доске
realeugene в сообщении #1736876 писал(а):
Нарисовано вручную человеком. С выдачи MiniZinc по коду, написанному ChatGPT.

Нарисовано в экселе, по выдаче qwen 3.7
До кода и sat дело не дошло, всё оказалось проще, иишка решила "в уме".

Задача как выяснилось имеет решение и в случае "3 ладьи + 1 ферзь" (варианты 4,10,11,12)

 [ Сообщений: 9 ] 


Соглашение о конфиденциальности | Общие правила

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group