Вниз  Разбор интересных задач
- 6.01.2011 / 22:23
XakepPRO
  Пользователь

XakepPRO 
Алгоритм заполнения массива по спирали на Pascal:

  1. uses crt;
  2. const nmax=50; {максимальный размер}
  3. var a:array[1..nmax, 1..nmax]of integer;{матрица}
  4.      n:integer; {размер матрицы}
  5.      i,j:integer; {координаты ячейки}
  6.      num:integer; {число в ячейке, счетчик (при N=4 от 1 до 16)}
  7.      add:integer;  {шаг =+1 при движении вправо и вниз,
  8.                        =-1 при движении влево и вверх}
  9.  
  10. begin
  11.  clrscr;
  12.  repeat
  13.    write('n=')readln(n);
  14.  until (n>1) and (n<=nmax); {проверяем правильность размера}
  15.  x:=0;
  16.  y:=1;
  17.  num:=1;
  18.  add:=n;
  19.  dir:=1;
  20.  while (add<>0) do
  21.    begin
  22.     i:=0
  23.     while (i<>add) do {вправо}
  24.       begin
  25.        x:=x+dir;
  26.        a[y,x]:=num;
  27.        num:=num+1;
  28.        i:=i+1;
  29.       end;
  30.     i:=0;
  31.     add:=add-1;
  32.     while (i<>add) do {вниз}
  33.       begin
  34.        y:=y+dir;
  35.        a[y,x]:=num;
  36.        num:=num+1;
  37.        i:=i+1;
  38.       end;
  39.     dir:=dir*(-1); {меняем знак и тоже самое влево и вверх}
  40.    end;
  41.  for i:=1 to n do
  42.   begin
  43.     for j:=1 to n do
  44.      write (a[i,j]:4);
  45.     writeln;
  46.   end;
  47. end.
  48.  
  49. Текст программы можно и укоротить, но сейчас это бесмысленно. Вводится значение переменной N, после чего идёт заполнение массива. Однако, если его вывести на экран, то он будет выглядеть так:
  50. 1   2  3   4
  51. 12 13 14 5
  52. 11 16 15 6
  53. 10 9   8  7

- 6.01.2011 / 22:35
XakepPRO
  Пользователь

XakepPRO 
Вот. Писал на телефоне. Под одеялом. С фонариком. Замучился. Щас на бейсике буду писать.
- 6.01.2011 / 22:37
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
XakepPRO, Ну раз на телефоне, то лови +
__________________
 let live
- 6.01.2011 / 23:03
XakepPRO
  Пользователь

XakepPRO 
CLS
Nmax=50 'Максимальный размер матрицы

WHILE N<1 AND N>Nmax
INPUT ''Введите размер матрицы: '', N
WEND

'Проверяем правильность

DIM a(1 TO N, 1 TO N)

X=0 : Y=1 'Координаты элемента массива
NUM=1 'Значение элемента массива (Х,У), счетчик. (при N=4 колеблется от 1 до 16)
ADD=n 'Длина отрезка от поворота до поворота
DIR=1 'шаг, направление движения. Равен +1, при движении вправо и вниз; равен -1, при движении влево и вверх

WHILE ADD<>0
I=0
  WHILE I=ADD 'вправо
  X=X+DIR
  a(X,Y)=NUM
  NUM=NUM+1
  I=I+1
  WEND
I=0
ADD=ADD-1
  WHILE I<>ADD 'вниз
  Y=Y+DIR
  A(Y,X)=NUM
  NUM=NUM+1
  I=I+1
  WEND
DIR=DIR*(-1) 'меняем знак, и поэтому направление при следующем повторе цикла будет влево и вверх
WEND

'Вывод матрицы

FOR I=1 TO N
FOR J=1 TO N
PRINT USING ''####''; A(X,Y);
NEXT J
PRINT
NEXT I

END

Все комменты такие же.
- 6.01.2011 / 23:44
XakepPRO
  Пользователь

XakepPRO 
Последней задачей является конкатенировать все строки массива, т.е. счцепить, склеить всё в один линейный массив (либо сразу отправить на экран).

Из предыдущих алгоритмов получилось, что массив у нас получился не так:

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

Как хотелось бы:

1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7

Что нам нужно сделать? Как сказал один человек: ''Вытянуть руки и включить моск''. В данном случае пройтись по матрице и занести все значения элементов так, чтобы подходило по условию задачи.
 
Мы будем считывать все значения элементов матрицы двигаясь следующим образом:
 
  1. C=1 'Счетчик
  2.  
  3. FOR I=1 TO N
  4. FOR J=1 TO N
  5. B(C)=A(J,I)
  6. C=C+1
  7. NEXT J
  8. NEXT I
 
Массив B объявляем заранее:

  1. DIM B(N*N)

--------

Pascal

  1. Var B:array [1..Nmax*Nmax] of integer;
  2.      C:integer;
  3.  
  4. C:=1;
  5. for i:=1 to N do
  6.     for j:=1 to N do
  7.       begin
  8.         B[C]:=A[j,i];
  9.         C+=1;
  10.       end;

За малым осталось вывести линейный массив на экран. Немножко изменений/добавлений кода и программа готова.
- 6.01.2011 / 23:49
LPzhelud
  Пользователь

LPzhelud 
Сейчас: Offline
XakepPRO, лови плюс
__________________
 Эль Презеденте
- 7.01.2011 / 00:23
XakepPRO
  Пользователь

XakepPRO 
Задача annimon.com/forum/?act=post&id=42819 ещё в силе.
- 7.01.2011 / 01:18
Freddy
  Пользователь

Freddy 
Сейчас: Offline
Ладно, на C я больше писать не буду :-D
- 7.01.2011 / 04:56
Dabann
  Пользователь

Dabann 
Сейчас: Offline
XakepPRO (06.01.2011/17:43)
Хмм.. Еще одна интересная, теперь уже простая задача.Задана строка символов. Среди литер этого текста особую роль играет знак #, появление которого означает отмену предыдущей литеры текста; k знаков о
Т.к. знаю только МВ, код писал на нем:
  1. 10 INPUT "введите текст",T$
  2. 20 PRINT "ждите...":SLEEP 250
  3. 30 T%=LEN(T$)
  4. 40 I%=1
  5. 50 IF LEFT$(T$,1)="#" THEN T$=MID$(T$,2,T%-1):GOTO 30
  6. 60 IF MID$(T$,I%,1)="#" THEN T2$=LEFT$(T$,I%-2):T$=T2$+MID$(T$,I%+1,T%-I%):GOTO 30
  7. 70 I%=I%+1
  8. 80 IF I%>T% THEN GOTO 100
  9. 90 GOTO 50
  10. 100 CLS
  11. 110 PRINT T$

А вот сама прога:


Прикрепленные файлы:
t0#exxa##t.jar (32.48 кб.) Скачано 270 раз
- 7.01.2011 / 05:58
Dabann
  Пользователь

Dabann 
Сейчас: Offline
^
|
Как я вовремя успел-то:)
Кстати, я чуть-чуть обманул... Я еще разум немного знаю, но эт не считается...

Изменено Dabann (7.01 / 05:59) (всего 1 раз)
Наверх  Всего сообщений: 751
Фильтровать сообщения
Поиск по теме
Файлы топика (34)