Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Спиральный обход с выводом строки, Поиск эффективного алгоритма 
:(
    Опции темы
obsidium
Дата 15.10.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Привет всем,столкнулся вот с такой задачей:

http://imcs.dvgu.ru/cats/main.pl?f=problem...7nor;cid=715078

Задача B. Спираль

Входной файл:    input.txt        Ограничение времени на тест:    1 сек
Выходной файл:    output.txt        Ограничение памяти на тест:    64 Мб

Условие:

Квадратная матрица размера n*n заполнена целыми числами от 1 до n*n следующим образом. 
В левом верхнем углу находится число n*n.
Остальные числа, начиная от n*n-1 вплоть до 1, располагаются в порядке убывания по спирали, закрученной по часовой стрелке. 


Например, при n = 2 и n = 3 матрица принимает вид:
4 3        9 8 7
1 2        2 1 6
           3 4 5

Требуется по данному размеру матрицы n и номеру r вывести r-ю строку матрицы.

Формат входного файла:
Входной файл содержит натуральные числа n и r.

Формат выходного файла:
Выходной файл должен содержать n чисел — r-ю строку матрицы.

Ограничения:
1<r<n<10^5

Примеры тестов №    Входной файл    Выходной файл
           1          2 1            4 3
           2          3 2            2 1 6
           3          4 3            6 1 2 11


Дело в том,что программу я написал.Только на Time limit exceeded on test 26.
Подскажите программеры всего мира как сгенерировать только одну строку каким-либо эффективным алгоритмом,чтобы и памяти мало занимало и выполнядось за 1 секунду.
Вот код Delphi:

Код

program spiral;

{$APPTYPE CONSOLE}

uses
  SysUtils;
{$apptype console}

type
 MyArray=array of Int64;

var
  a:MyArray;
  i,j,c,r:integer;
  t1,t2:text;
  n,t:int64;

begin
 assign(t1,'input.txt'); reset(t1);
 assign(t2,'output.txt'); rewrite(t2);


  read(t1,n,r);
 SetLength(a,n);
  //for i:=0 to n-1 do
   //SetLength(a[i],n);


   i := 1;
   j := 1;
   c := 0;
   t := n*n;

   repeat

       while (j <= n - c) do
       begin
       if (i=r) then
        A[j-1] := t;
       inc(j); dec(t); end;
       inc(i); dec(j);

       while (i <= n - c) do
       begin
       if (i=r) then
        A[j-1] := t;
       inc(i); dec(t); end;
       dec(j); dec(i);

       while (j >= 1 + c) do
       begin
       if (i=r) then
        A[j-1] := t;
       dec(j); dec(t); end;
       inc©; inc(j); dec(i);

       while (i >= 1 + c) do
       begin
        if (i=r) then
         A[j-1] := t;
       dec(i); dec(t);
       end;
       inc(j); inc(i);

   until c > n div 2;


 for j:=0 to n-1 do
     write(t2,a[j],' ');

close(t1);
close(t2);

end.


P.S. Буду весьма признателен.Эту задачу я долго мучал,но никак не могу добиться окончательного эффективного решения.
e-mail
Модератор:  пользуемся кнопкой "Код"


Это сообщение отредактировал(а) maxim1000 - 15.10.2010, 23:08

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  spiral.dpr 1,10 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.