Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2013, 11:31   #1
rus084
Новичок
Джуниор
 
Регистрация: 16.11.2013
Сообщений: 2
По умолчанию запутался в задачах - олимпиадная задача "Сканворд"

здравствуйте , нужно решить задачи по информатике по программированию .
1 я сделал , другие немогу
вот первая :
Сканворд

Имя входного файла input.txt
Имя выходного файла output.txt
Максимальное время работы на одном тесте 2 секунды
Ограничение по памяти 64 МБ
Вася все свое свободное время тратит на решение сканвордов. Сканводр представляет собой прямоугольную таблицу, в пустые клетки которой нужно вписывать слова по горизонтали и по вертикали. В сканводре каждое слово начинается сразу от непустой клеткой или от границы таблицы. Заканчиваются слова соответственно на границе таблицы или перед непустой клеткой. Никакие два слова не следуют друг за другом подряд и не накладываются. Слова могут пересекаться друг с другом только в том случае, если одно слово идет по горизонтали, а второе по вертикали. В сканворде не используются слова длиной меньше двух букв. Для каждого слова в непустые клетки или за границей сканворда записываются вопросы-подсказки, помогающие отгадать слово. Таким образом, любая несвободная клетка может содержать либо вопросы-подсказки, либо рекламу, а во все пустые клетки должны вписываться буквы слов-ответов.
Порешав сотни сканвордов, Вася решил создать свой собственный. Для начала он хочет составить прямоугольную таблицу размером N×M, а затем вписать туда свои слова. При составлении таблицы он случайным образом закрасил часть клеток и решил, что в них будут размещаться вопросы-подсказки. Но тут до него дошло, что при случайном формировании таблицы у него может не получиться правильный сканворд. Так как переделывать всю работу долго, он решил закрасить еще несколько клеток и получить правильный сканворд. Помогите Васе подсчитать, какое минимальное количество клеток придется закрасить.
Формат входных данных:
В первой строке входного файла заданы два целых числа N и M (3 ≤ N, M ≤ 1000). В последующих N строках записано по M символов, причем, символ "." обозначает клетку, в которую будут вписываться буквы, а символ "#" обозначает клетку, в которой будет размещаться вопрос-подсказки или реклама.
Формат выходных данных:
В выходной файл выведите, какое количество клеток нужно закрасить
Пример
input.txt output.txt
3 4
....
....
.... 0


4 3
###
#.#
###
#.# 2

я незнаю как сделать ввод строки переменной длинны
rus084 вне форума Ответить с цитированием
Старый 16.11.2013, 12:54   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Читайте сразу строкой
Код:
Readln(f,s);
f - файловая переменная, ассоциированная с конкретным файлом. S - строка из этого файла. В s[0] хранится длина строки в символах, либо есть функция length.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 16.11.2013, 13:02   #3
rus084
Новичок
Джуниор
 
Регистрация: 16.11.2013
Сообщений: 2
По умолчанию

спасибо , но непонятно что дальше
rus084 вне форума Ответить с цитированием
Старый 16.11.2013, 14:13   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Например так:
Текст такой
Цитата:
4 6
######
#.#.#.
......
......

Код:

uses
  sysutils;
var
  f:text;
  s:string;
  a:array[1..100] of string;
  i,j:integer;
  n,m,k:integer;
begin
  assign(f,'input.txt');
  reset(f);
  readln(f,s);
  n:=strtoint(s[1]); // читаем сколько строк
  m:=strtoint(s[3]); // сколько символов
  i:=1;
  while not eof(f) do
    begin
      readln(f,a[i]); //читаем остальные строки, занеся их в массив
      i:=i+1;
    end;
  k:=0;
  for i:=1 to n do
    for j:=1 to m do
      if a[i,j]='#' then // сколько решеток?
        k:=k+1;
  writeln(k);
  close(f);
  readln;
end.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.11.2013, 23:35   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ZX Spectrum-128, Вы уверены, что Ваш код для входных данных
Цитата:
Код:
4 3
###
#.#
###
#.#
выдаст правильный ответ (должно быть 2)?!

это же олимпиадная задача.
Кстати, вот на неё ссылка:
Главная / Соревнования / Муниципальный этапа Всероссийской олимпиады по информатике 2013/2014. День 2. / Сканворд

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


Цитата:
Сообщение от rus084 Посмотреть сообщение
спасибо , но непонятно что дальше
что дальше - проверяйте строки и столбцы, где непрерывная длина из свободных полей ('.') меньше или равна 2-м и закрашивайте их (подсчитывая, сколько ячеек Вам пришлось закрасить - это и будет ответом).
Учтите, что после закрашивания, ситуация на поле может изменится (вы решёткам перекроете перпендикулярную линию), поэтому нужно проходить по матрице в тех местах, где закрашиваете повторно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.11.2013, 07:45   #6
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Нет, ни в коем случае. Я и НЕ собирался решать задачу. Моей целью было показать как читать строки из файла и как работать с массивом строк.
Upd:
Надо было пояснить в том посте, что я не решаю задачу, а только делаю, что написал выше.

Последний раз редактировалось ZX Spectrum-128; 18.11.2013 в 08:10.
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Олимпиадная задача СергейАстрахань Помощь студентам 2 31.01.2013 11:48
Олимпиадная задача. Godziller Фриланс 6 28.05.2012 14:10
олимпиадная задача quade1992 Паскаль, Turbo Pascal, PascalABC.NET 0 17.05.2012 18:57
Олимпиадная задача Alexey_kor Помощь студентам 7 30.01.2011 02:22
Олимпиадная задача Carbon Общие вопросы C/C++ 2 23.05.2007 22:07