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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2010, 14:01   #1
cbuilderx
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 18
Восклицание Спиральный обход с выводом строки

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

http://imcs.dvgu.ru/cats/main.pl?f=p...nor;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(c); 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. Буду весьма признателен.Эту задачу я долго мучал,но никак не могу добиться окончательного эффективного решения.
Вложения
Тип файла: rar spiral.rar (1.0 Кб, 7 просмотров)
Дорога возникает только под шагами идущего...

Последний раз редактировалось Stilet; 15.10.2010 в 14:33.
cbuilderx вне форума Ответить с цитированием
Старый 15.10.2010, 15:39   #2
cbuilderx
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 18
По умолчанию

Если кого заинтересовало,задача классическая на самом деле,то скомилируйте spiral.dpr в ближайшем Delphi комплияторе.Не забудьте создать input.txt(два числа через пробел) и output.txt -->>F9...
Дорога возникает только под шагами идущего...
cbuilderx вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход Н/Д Slavik Microsoft Office Excel 2 09.05.2009 00:49
Помогите с выводом строки MaxMelnikov Паскаль, Turbo Pascal, PascalABC.NET 1 15.12.2008 14:42
Помогите сделать программу c выводом строки задом наперед(Pascal) Batman10000 Помощь студентам 2 14.12.2008 17:54
Проблема с выводом строки kezman Общие вопросы C/C++ 1 30.08.2008 20:41