М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
LIZETTA111
LIZETTA111
11.01.2021 12:34 •  Информатика

Максу требуется пройти медкомиссию, состоящую из n различных врачей. уже у стойки регистрации макс понял, что день будет долгим: посещать врачей нужно в строго определённом порядке, например, терапевт не принимает без отметок хирурга и лаборатории, перед посещением хирурга нужно сходить к офтальмологу, лаборатория не принимает без узи, и так далее. макс окончательно запутался в требованиях, кого перед кем нужно посетить. составьте для него такой план посещения врачей, чтобы для каждого врача все требуемые кабинеты были посещены ранее и ни к одному врачу не приходилось заходить дважды. входные данные первая строка содержит целое число n (1 ≤ n ≤ 500) — количество врачей, которых необходимо посетить. следующие n строк описывают предварительные требования каждого из врачей. каждая их них содержит целое число mi (0 ≤ mi ≤ n - 1) — количество врачей, которых необходимо посетить перед посещением текущего врача. далее в строке следуют mi различных целых чисел aij (1 ≤ aij ≤ n) — номера врачей, которых требуется посетить. врачи нумеруются от 1 до n в порядке описания во входных данных. выходные данные выведите n целых чисел — номера врачей в порядке посещения. если подходящих ответов несколько, выведите любой из них. если ответа не существует, выведите -1.

👇
Ответ:
Фариза1111111
Фариза1111111
11.01.2021
Для начала попробуем разобрать один из решения подобных задач.

Рассмотрим контрольный пример.
Входные данные:
5 - это количество врачей, т.е. нижеследующих строчек.
2 3 5 - 1-й врач. У него 2 предшественника - врачи 3 и 5
2 3 5 - 2-й врач. У него 2 предшественника - врачи 3 и 5
1 5 - 3-й врач. У него 1 предшественник - врач 5
3 1 3 5 - 4-й врач. У него 3 предшественника - врачи 1, 3 и 5
0 - 5-й врач. У него нет предшественников.
Вариант результата: 5 3 1 2 4 - в таком порядке посещаются врачи.

Изобразим эти данные графически. В кружочках проставим номера врачей и соединим кружочки стрелками, отображающими взаимосвязи (первое вложение). Полученный рисунок - ни что иное, как ориентированный граф.

Решение будет состоять в поиске порядка посещения всех вершин графа ("врачей") в соответствии с доступными путями ("очередностью").
Очевидно, что первой нужно посетить вершину, из которой пути только выходят. Если ни одной такой вершины нет - задача решения не имеет. В нашем случае такая вершина есть - номер 5 и она помечена зеленым. После посещения мы удаляем эту вершину и все ведущие из нее пути. Получаем картину, представленную вторым вложением. Повторяем наше рассуждение и находим вершину 3. Снова удаляем её и выходящие из нее пути. В третьем вложении мы видим, что доступны сразу две вершины - 1 и 2. Их можно посетить в любом порядке, т.е. решение не единственное. Будем придерживаться порядка возрастания и и вычеркнем 1 с путём, а затем и 2. В чевертом вложении остается свободная вершина 4. Посещаем её, вычеркиваем - граф исчез, задача решена. И порядок посещения совпал с контрольным решением.

Теперь, когда "ручное" решение понятно, можно строить алгоритм.
Мы использовали граф, а граф в программировании представляется парой множеств: множеством вершин и множеством путей, их соединяющих.
Эти множества классически представляются двумя матрицами - матрицей смежности (отображает вершины и наличие связей) и матрицей инцидентности (отображает направление связей и, возможно, длины путей). Другие варианты - списки или деревья, но они требуют набора процедур для соответствующих манипуляций.

В связи с относительной простотой задачи был выбран собственный вариант отображения графа на квадратную матрицу размера (n+1)×n, где n- количество вершин (врачей). Первая строка матрицы является служебной, остальные отображают граф. В пятом вложении приведена принятая схема отображения. Собственно, из этой схемы понятна основная идея реализации. Создаем матрицу, расписываем её нулями, затем заносим единицы, создавая связи. Решение состоит в последовательном переборе колонок до нахождения столбцов, содержащих все нули. Найденный столбец "вычеркивается" (записывается 1 в нулевой строке), а его номер - это номер посещенной вершины. Процесс повторяется, пока в служебной строке не будут все единицы, либо пока не будет n раз сделан проход по столбцам (от зацикливания при отсутствии решения).

Поскольку программа может показаться нетривиальной, в нее внесены операторы отладки, позволяющие по шагам проследить решение. Как управлять отладкой, ясно из комментариев. Если отладка не нужна, достаточно из программы удалить все строки, отмеченные \\-

// PascalABC.NET 3.2, сборка 1417 от 28.03.2017
// Внимание! Если программа не работает, обновите версию!

begin
  var n:=ReadInteger; // первая строка - число врачей
  var a:=MatrFill(n+1,n,0); // матрица посещений
  var t:integer;
  for var i:=1 to n do begin // цикл ввода по каждому врачу
    var k:=ReadInteger; // количество врачей-предшественников
    for var j:=1 to k do begin
      Read(t);
      a[t,i-1]:=1
      end;
    end;
  t:=0;
  var res:='';
  var debug:=true; //- debug:=false блокирует отладочную выдачу
  if debug then begin //-
    Writeln('исходная матрица'); //-
    a.Println(2); Writeln //-
    end; //-
  for var m:=1 to n do begin
    for var j:=1 to n do begin
      var c:=a.Col(j-1);
      if c[0]=0 then begin
        if c.All(x->x=0) then begin
          Res+=j+' ';
          if debug then Writeln(Res); //-
          a[0,j-1]:=1;
          for var i:=0 to n-1 do a[j,i]:=0;
          if debug then begin //-
            a.Println(2); Writeln //-
            end //-
          end
        end;
      end;
    if a.Row(0).All(x->x=1) then begin t:=1; break end;
    end;
  if t=0 then Writeln(-1)
  else Writeln(Res)
end.

Пример решения с выключенной отладкой
5
2 3 5
2 3 5
1 5
3 1 3 5
0
5 3 1 2 4

Пример со включенной отладкой (можно исходные данные для удобства все писать в одной строке)
5 2 3 5 2 3 5 1 5 3 1 3 5 0
исходная матрица
 0 0 0 0 0
 0 0 0 1 0
 0 0 0 0 0
 1 1 0 1 0
 0 0 0 0 0
 1 1 1 1 0

5
 0 0 0 0 1
 0 0 0 1 0
 0 0 0 0 0
 1 1 0 1 0
 0 0 0 0 0
 0 0 0 0 0

5 3
 0 0 1 0 1
 0 0 0 1 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0

5 3 1
 1 0 1 0 1
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0

5 3 1 2
 1 1 1 0 1
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0

5 3 1 2 4
 1 1 1 1 1
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0

5 3 1 2 4

Максу требуется пройти медкомиссию, состоящую из n различных врачей. уже у стойки регистрации макс п
Максу требуется пройти медкомиссию, состоящую из n различных врачей. уже у стойки регистрации макс п
Максу требуется пройти медкомиссию, состоящую из n различных врачей. уже у стойки регистрации макс п
Максу требуется пройти медкомиссию, состоящую из n различных врачей. уже у стойки регистрации макс п
Максу требуется пройти медкомиссию, состоящую из n различных врачей. уже у стойки регистрации макс п
4,7(49 оценок)
Открыть все ответы
Ответ:
Айлин1290
Айлин1290
11.01.2021
Программирование циклических алгоритмов Цикл – это команда исполнителю многократно повторить указанную последовательность команд. Три основных типа циклов : • Цикл с предусловием - while (цикл-ПОКА) • Цикл с постусловием - repeat (цикл-ДО) • Цикл с заданным числом повторений - for (цикл с параметром) Программирование циклов с заданным условием продолжения работы Цикл с предусловием – пока истинно условие цикла, выполняется тело цикла. Цикл с заданным условием продолжения работы (цикл-ПОКА) программируется в языке Паскаль с оператора while. Общий вид оператора: • while <условие> do <оператор> Здесь: • <условие> — логическое выражение; пока оно истинно, выполняется тело цикла; • <оператор> — простой или составной оператор, с которого записано тело цикла. условие тело цикла ДА НЕТ Запишем на языке Паскаль алгоритм получения частного q и остатка г от деления целого числа х на целое число у без использования операции деления. program ostatok; var х, у, q, r: integer; begin writeln (’Частное и остаток’); write ('Введите делимое х-> ’) ; readln (х); write (’Введите делитель у->’); read (у); r:=х; q:=0; while r>=y do begin r:=r-y; q:=q+l end; writeln ('Частное q=’, q); writeln (’Остаток r=’, r) end. Программирование циклов с заданным условием окончания работы. Цикл с постусловием – тело цикла выполняется до удовлетворения условия. Цикл с заданным условием окончания работы (цикл-ДО) программируется в языке Паскаль с оператора repeat. условие тело цикла ДА НЕТ Общий вид оператора: repeat <оператор1; оператор2;… > until <условие> Здесь: <оператор1>; <оператор2>; ...- операторы,образующие тело цикла; <условие> — логическое выражение; если оно ложно, то выполняется тело цикла. Необходимо решить задачу: Спортсмен приступает к тренировкам по следующему графику: в первый день он должен пробежать 10 км; каждый следующий день следует увеличивать дистанцию на 10% от нормы предыдущего дня. Как только норма достигнет или превысит 25 км, необходимо прекратить её её увеличение и далее пробегать ежедневно ровно 25 км. Начиная с какого дня спортсмен будет пробегать 25 км? Запишем на языке Паскаль алгоритм решения задачи о графике тренировок спортсмена. program sportsmen; var i: integer; х: real; begin writeln('График тренировок'); i:=1; x:=10; repeat i:=i+l; x:=x+0.1*x; until x>=25; writeln (’Начиная с ‘ , i, ‘ –го дня спортсмен будет пробегать 25 км’) end. Программирование циклов с заданным числом повторений Цикл с заданным числом повторений (цикл-ДЛЯ) программируется в языке Паскаль с оператора for. Его общий вид: for <параметр>:=<начальное_значение> to <конечное_значение> do <оператор> Здесь: <параметр> — переменная целого типа; <начальное_значение> и <конечное_значение> — выражения того же типа, что и параметр, вычисляемые перед началом цикла; <оператор> — простой или составной оператор — тело цикла. При выполнении этого оператора после каждого выполнения тела цикла происходит увеличение на единицу параметра цикла; условием выхода из цикла является превышение параметром конечного значения. Запишем на языке Паскаль алгоритм вычисления степени с натуральным показателем п для любого вещественного числа а. program stepen; var i, n: integer; a, у: real; тело цикла i=i1,i2…in begin writeln('Возведение в степень’); write (’Введите основание а»’); readln(а); write (’Введите показатель n» ’); readln(n); у:=1; for i:=l to n do y:=y*a; writeln ( ’an=’ , у) end. В заданиях Л и М применяется последний случай циклического алгоритма, т.е. цикл с заданным числом повторений …for i:=15 to 56 do s:=s+i… Задания Н и О на генератор псевдослучайных чисел Random, см. в следующей ссылке!

Объяснение:

4,6(30 оценок)
Ответ:
Biszkopt99
Biszkopt99
11.01.2021
Const m=4; n=15;
var
  i,j,j0: integer;
  a:array[1..m,1..n] of integer;
  jExit,iExit:Boolean;
begin
  Randomize;
  for i:=1 to m do begin
    writeln;
    for j:=1 to n do begin
      a[i,j]:=random(2);
      write(a[i,j]:2)
      end
    end;
  writeln;
  j:=0; jExit:=false;
  repeat
    j:=j+1; i:=1; iExit:=false;
    if a[i,j]=0 then begin
      repeat
        i:=i+1;
        if a[i,j]<>0 then iExit:=true
      until iExit or (i=m);
      if i=m then jExit:=true
      end
    until jExit or (j=n);
  if a[i,j]=0 then writeln('Нулевой столбец ',j)
  else writeln('Нет нулевых столбцов');
end.

Тестовый пример:

 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1
 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1
 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0
Нулевой столбец 13
4,6(35 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ