Нужно задать вопрос любому из них: "Если бы ты отвечал на вопрос:"За какой дверью дракон", что бы ты ответил?" Если спросили честного, он и ответит так, как бы ответил. Если спросили лжеца, то он соврет относительно своего ответа, т.е. в любом случае ответит правдиво. Как бы двойной фильтр, результат которого для лжи и правды одинаков.
Var n, i, z, step, k, g, retry: integer; // n - количество карточек (вводит пользователь), остальное - обычные счетчики циклов
c: array[1..300000] of integer; // массив, в котором хранятся все наши карточки
begin
write('Введите количество карточек: '); // рекомендую для теста вводить около десяти , т.к. больше вероятность, что попадутся одинаковые числа и вы сможете увидеть результат
readln(n);
writeln();
writeln('Карточки: ');
for z := 1 to n do begin
c[ z ] := random(10); // создается <em>n</em> карточек
//c[ 1 ] := 3; эти строки я закомментировал
//c[ 2 ] := 0; их можно удалить
//c[ 3 ] := 7;
//c[ 4 ] := 6; просто проверял работу своими значениями
//c[ 5 ] := 6;
//c[ 6 ] := 3;
//c[ 7 ] := 4;
//c[ 8 ] := 0;
//c[ 9 ] := 2;
//c[ 10 ] := 2;
write( '|' , c[ z ], '| ' ); // вывод обрамленных карточек
end;
step := 0; // переменная, которая считает шаги
writeln();
for retry := 1 to 11 do begin // главный цикл, который прогоняет второстепенный цикл 11 кругов, для того, чтобы исключить вероятность, что "сзади" остались одинаковые числа
for z := 1 to n do begin // второстепенный цикл
if z >= n then break // в случае конца выходим из цикла и отдаем управление программой главному циклу (тот что выше)
else begin // начинаем проверять карточки слева направо, пока не достигнут конец. в случае оного - выполняется действие выше
if c[ z ] = c[ z + 1 ] then begin // сравниваем соседние карточки. если они равны, то начинаем делать шаг
inc(step);
writeln();
writeln( step, ' шаг ', retry, ' круг: ');
inc( c[ z ] );
for g := 1 to ( n - z ) do c[ z + g ] := c[ z + g + 1 ]; // удаляем две одинаковых карточки, оставляем одну, увеличенную на 1
n := n - 1; // сокращаем количество карточек на 1
writeln();
for k := 1 to n do write( '|' , c[ k ], '| ' ); // вывод каждого шага
writeln();
end;
end;
end;
end;
<span>writeln();
end.</span>
Проверено - работает на Паскаль АВС
Program mashaaq;
uses crt;
const n=12;
const m=15;
var
a:array[1..n,1..m] of integer;
b:array[1..n] of integer;
i,j,minus : integer;
begin
Randomize;
for i:=1 to n do
for j:=1 to m do
a[i,j]:= Random(101)-50; //заполняем массив случайными числами
writeln('*** alphaues is thinking... ***');
writeln('*** OK ***');
for i:=1 to n do //просматриваем строки сверху вниз
begin
minus:=0;
for j:=1 to m do //просматриваем строку
if a[i,j]<0 then minus:=minus+1; //если найден отрицательный элемент, увеличиваем счётчик minus на единицу
b[i]:=minus; //сохраняем значение счётчика для i-й строки
end;
writeln;
{выводим матрицу А и вектор результатов В}
{в красивой рамочке :)}
writeln('**************************************************************************');
writeln('* Массив * Вектор *');
writeln('**************************************************************************');
for i:=1 to n do
begin
write ('* ');
for j:=1 to m do
write(a[i,j]:4); //выводим строку массива
writeln(' * ',b[i]:2,' *'); //дописываем справа значение вектора В для этой строки
end;
writeln('**************************************************************************');
end.