Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 17.03.2011
Сообщений: 12
1

Не могу сделать заполнение матрицы по спирали с заданным интервалом между элементами!

29.07.2012, 14:51. Показов 930. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, дорогие форумчане!!!
Делаю программу одному другу - он занимается игрой в государственные лотереи и попросил составить ему программу следующего содержания:

Дана последовательность 80 чисел (как она рассчитывается, думаю, можно упустить)...
Далее с этой последовательностью делаем следующее:

1) Он сам выбирает расстояние между элементами и матрица 9х9 заполняется с заданным интервалом (причем ячейка с индексом [9,9] (если нумерация элементов начать не с 0 как в С-подобных языках, а c 1),
например, если интервал=0, то матрица заполняется по обычной спирали (с этим проблем нет - еще в школе его разобрал), но если интервал > 1, то возникают проблемы... Вот как это выглядит при интервале 1 (покажу на матрице 5х5):

| 1| 9 | 2|10| 3|
| 8|16| |17|11|
|15| |20| | 4|
| 7|19| |18|12|
|14| 6|13| 5|free|

На этом 1 этап прохода заканчивается, как видно - пустую клетку вообще не учитываем и при вычислении следующего номера ячейки ее упускаем, как будто и нет ее. На следующем этапе ищем самую первую свободную ячейку (сверху вниз, слева - направо) - с этим проблем у меня не возникнет и заполняем оставшиеся пустые клетки.

| 1| 9 | 2|10| 3|
| 8|16|21|17|11|
|15|24|20|22| 4|
| 7|19|23|18|12|
|14| 6|13| 5|free|

Вот как это объяснить компилятору????
Можете предложить способы решения данной проблемы, а, в частности, я предлагаю свое видение решения:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
i = 1 // Порядковый номер элемента исходного массива
index = {0,0}; // Массив с координатами следующей ячейки, получаемой из функции
ind_i = 0; // Номер текущей строки элемента
ind_j = 0; // Номер текущего столбца элемента
dx = 1 // Шаг
while (i <= 80)
{
    if (i == 0)
    {
         arr_res[ind_j, ind_i] = arr_src[i];
         i++;
    }
    else
    {
         index = GetNextFreeCell(ind_j, ind_i, dx)
         ind_i = index[0];
         ind_j = index[1];
         arr_res[ind_j][ind_i] = arr_src[i];
         i++;
    }
}
Но вот как реализовать функцию получения индекса следующей ячейки, в которую нужно вставить следующий элемент.... Вот этого я не знаю.... Может, кто-то может предложить способ решения проблемы????
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2012, 14:51
Ответы с готовыми решениями:

Не могу составить программу для заполнения матрицы по спирали с заданным интервалом между ячейками!
Здравствуйте, дорогие форумчане!!! Делаю программу одному другу - он занимается игрой в...

Заполнение матрицы по спирали
заполнить массив 5*5 по спирали от центра по часовой стрелке от 1 до 25....

Заполнение матрицы по спирали
Помогите с заполнением массива по спирали, n-ого размера 1 0 0 0 9 2 0 0 8 10 3 0 7 6 5 4

Заполнение матрицы по спирали
Привет всем, можете помочь пожалуйста: надо придумать алгоритм, написать код на С++ заполнения...

1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.08.2012, 14:26 2
demon_666_902, может быть на ассемблере будет понятнее?
взято здесь
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
.model tiny
.code
.486
org 100h
start: mov  ax,3;очистили экран
 int  10h 
 push 0B800h;адрес видеобуфера в регистр ES
 pop  es
 xor  di,di; di=0 
 imul ax,[n],6; ax=n*6
 mov  [bounds],ax
 imul cx,[n],160; cx=n*160
 add  ax,cx;ax=n*166
 sub  ax,6
 mov  [bounds+2],ax
 sub  cx,166
 mov  [bounds+4],cx   
 xor  bx,bx
 xor  ax,ax
 mov  cx,[n]
 shl  cx,1
 dec  cx;cx=2*n - 1
 
 a:push eax
   shl  eax,8
   shr  ax,8
   add  eax,07300730h
   rol  eax,16
   mov  es:[di],eax
   pop  eax
   inc  ax
   aaa
   add  di,[steps+bx]
   cmp  di,[bounds+bx]
 jne a
 mov dx,[bsteps+bx]
 add [bounds+bx],dx
 add di,dx 
 add bx,2
 and bx,7
 loop a 
 xor ax,ax; ждем нажатия на любую клавишу
 int 16h  
ret; выход из программы
; данные------------------------------
n      dw 5
steps  dw 6,160,-6,-160
bsteps dw 154,-166,-154,166
bounds dw 4 dup(0) 
end start
0
20.08.2012, 14:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2012, 14:26
Помогаю со студенческими работами здесь

Заполнение матрицы по спирали
Дано натуральное N (1&lt;=N&lt;=10). Заполнить матрицу порядка N*N целыми числами 0, 1, 2, 3, …, N^2–1 по...

Заполнение матрицы по спирали
Напишите программу, которая заполняет матрицу из N строк и M столбцов заполненную заданным...

Заполнение матрицы по спирали
Вывести на языке СИ такую матрицу (5 на 5, размерность можно изменять) 1 2 3 4 5...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru