Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с матрицей, заполнить по спирали 
V
    Опции темы
rlzz
Дата 1.8.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



дана матрица 5 на 3 

нужно ее запонить таким образом 

      1_2_3_4_5
12-13_14_15_6
11_10_9  _8_   7

какие мысли у кого я второй час сижу позеленел уже ... помагите

PS Прозьба не пинать видел я тут алгоритмы на матрицы 10 *10  5*5 ... они не помагли...  smile 
PM MAIL   Вверх
volvo877
Дата 1.8.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



rlzz, все просто на самом деле:

Код

uses crt;

const
  m = 3;
  n = 5;

type
  TMx = array[1 .. m, 1 .. n] of integer;

procedure Print(mx : TMx);
var i, j: byte;
begin
  writeln;
  for i := 1 to m do begin
    writeln;
    for j := 1 to n do write(mx[i,j]:3);
 end;
end;

procedure SpiralFill(var mx : TMx);
var
  i, j, c : byte;
  A: integer;
begin

   i := 1;
   j := 1;
   c := 0;

   A := 1;

   repeat

       while (j <= n - c) do begin mx[i,j] := A; inc(j); inc(A); end;
       inc(i); dec(j);

       while (i <= m - c) do begin mx[i,j] := A; inc(i); inc(A); end;
       dec(j); dec(i);

       while (j >= 1 + c) do begin mx[i,j] := A; dec(j); inc(A); end;
       inc(c); inc(j); dec(i);

       while (i >= 1 + c) do begin mx[i,j] := A; dec(i); inc(A); end;
       inc(j); inc(i);

   until c > n div 2;

end;

var
   mx : TMx;

begin
   clrscr;
   SpiralFill(mx);
   Print(mx);
   readln;
end.

PM MAIL   Вверх
rlzz
Дата 2.8.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile  smile 
PM MAIL   Вверх
obsidium
  Дата 14.10.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Покопался на форумах в поисках алгоритма и наткнулся на твой алгоритм вот здесь:
http://forum.vingrad.ru/forum/topic-166088/unread-1.html

Дело в том,что программу я написал.Только на Time limit exceeded on test 26.
Подскажи как сгенерировать одну строку эффективней.
Вот код 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. Буду весьма признателен,если поможешь.Эту задачу я долго мучал,но никак не могу добиться окончательного эффективного решения.
 smile 

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

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

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

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


 




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


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

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