|
Вопрос # 5 123/ вопрос открыт / |
|
Здравствуйте!Помогите написать программу на языке С++.
Запрограммировать заполнение матрицы произвольного размера m*n числами 1,2,3,4,5,6...со схеме 1(2).
Матрицу задать фиксированного большого размера M*N, где M, N - константы, заданные в тексте программы. Размеры m, n задать переменными, вводимыми при работе программы с проверкой условия m<=M и n<=N.
Схема 1.
5 6 7 8 9 10
4 21 22 23 24 11
3 20 29 30 25 12
2 19 28 27 26 13
1 18 17 16 15 14
Схема 2.
25 23 22 16 15
24 21 17 14 7
20 18 13 8 6
19 12 9 5 2
11 10 4 3 1
(На фотографии это вариант 4 и 12.)
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задала: N@tySuk (статус: Посетитель)
Вопрос отправлен: 24 марта 2011, 22:50
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Толяныч
Здравствуйте, N@tySuk!
Код выглядит приблизительно так ( это на простом С, отличия будут только во вводе-выводе ).
В начале подпрограммы fill вычисляются координаты верхней и нижней точки диагоналей, а дальше проводится заполнение : на прямом проходе влево-вниз, на обратном - вправо-вверх. Начальная и конечная точки заполняются вне цикла. Просто, как вермишель.
Приложение: Переключить в обычный режим- #include <stdio.h>
- #include <string.h>
- int Nx,Ny,N,arr[100][100] ;
- int ATop[100][2],ABott[100][2] ;
- void fill( int ny, int nx)
- {
- int ix,iy,k,ks,pr ;
- N= 1 ; pr = 1 ; ks = nx+ny-3 ; k=0 ; pr=0 ;
- for (ix = 1;ix<=ks;ix++)
- { if (ix<nx-1) {ATop[ix][0]=ix ; ATop[ix][1]=0 ; }
- else {ATop[ix][0]=nx-1 ; ATop[ix][1]=k++ ; }
- if (ix<ny-1) {ABott[ix][0]=0 ; ABott[ix][1]=ix ; }
- else {ABott[ix][0]=pr++ ; ABott[ix][1]=ny-1 ; }
- }
- arr[ny-1][nx-1]=1 ;
- N= 2 ; k = nx+ny-3 ;
- for (k=ks,pr=0;k>0;k--)
- {
- if (pr==0)
- for (ix=ATop[k][0],iy=ATop[k][1];ix >= ABott[k][0];ix--)
- arr[iy++][ix]=N++ ;
- else
- for (ix=ABott[k][0],iy=ABott[k][1];ix <= ATop[k][0];ix++)
- arr[iy--][ix]=N++ ;
- pr++ ; pr&=1 ;
- }
- arr[0][0]=nx*ny ;
-
- }
-
- void display(int ny, int nx)
- {
- int i,j ;
- for (i = 0 ; i<ny ; i++)
- { for (j =0 ; j<nx ; j++)
- { printf ( "%4d",arr[i][j]) ;}
- printf ("\n") ;
- }
- }
-
- void main(void)
- {
- puts ("Row") ; scanf ("%d",&Ny) ;
- puts ("Col") ; scanf ("%d",&Nx) ;
- fill (Ny,Nx) ; display (Ny,Nx) ;
- }
-
-
-
- Row
- 7
- Col
- 5
- 35 33 32 26 25
- 34 31 27 24 16
- 30 28 23 17 15
- 29 22 18 14 7
- 21 19 13 8 6
- 20 12 9 5 2
- 11 10 4 3 1
-
-
 |
Ответ отправил: Толяныч (статус: 4-ый класс)
Время отправки: 28 марта 2011, 00:57
Оценка за ответ: 5
Комментарий к оценке: Спасибо Вам огромное!!!Вы мне очень помогли)))
|
Мини-форум вопроса
Всего сообщений: 18; последнее сообщение — 30 марта 2011, 18:27; участников в обсуждении: 6.
|
Мережников Андрей (статус: Абитуриент), 24 марта 2011, 23:43 [#1]:
в чем собственно вопрос? Что непонятно в задании?
|
|
n1tn4tsn0k (статус: 1-ый класс), 25 марта 2011, 01:55 [#2]:
Решение для первой схемы(правда на Си, а не на Си++, но переделать человеку, изучающему плюсы, труда не составит):
#include <stdlib.h>
#include <stdio.h>
#define M 100
#define N 100
int m, n;
int i, j;
int A[M][N];
void fill(int i2, int j2, int v)
{
i += i2;
j += j2;
A[i][j] = v;
if (v == m*n)
return;
if (i+i2 < 0 || j+j2 < 0 || i+i2 >= m || j+j2 >= n || A[i+i2][j+j2] != 0)
fill(-j2, i2, v+1);
else
fill(i2, j2, v+1);
}
int main()
{
scanf("%i %i", &m, &n);
i = 0;
j = n-1;
A[i][j] = 1;
fill(0, -1, 2);
for (j=0;j<n;j++) {
for (i=0;i<m;i++)
printf("%i ", A[i][j]);
puts("");
}
return 0;
}
Над второй уже лень думать, да и спать хочется. Может завтра напишу, если никто другой не напишет. Удачи!
|
|
Мережников Андрей (статус: Абитуриент), 25 марта 2011, 05:38 [#3]:
первые четыре схемы отличаются друг от друга только начальной точкой.
|
25 марта 2011, 12:20: Вопрос перемещён из тематического раздела C++ в раздел Лабораторный практикум » Разное модератором Ерёмин А.А.
|
N@tySuk (статус: Посетитель), 25 марта 2011, 12:37 [#4]:
А как сделать 12 вариант(диагональную змейку)и как поменять начальную точку? В языке С++ разбираюсь плохо!
|
|
matkus (статус: Заблокирован), 25 марта 2011, 18:57 [#5]:
Уважаемый n1tn4tsn0k, Ваша прога не работает (это видно без какой-либо проверки). Вы это вообще откуда взяли? Вы, типа, сами от балды нахерачили её? Сасуньте этот несчастный "исходник" себе жопу и, как говорили японцы в Южном Парке, "в жопу Вам китов"!!!
|
|
matkus (статус: Заблокирован), 25 марта 2011, 18:59 [#6]:
Бля, ошибку в слове сделал, сука!!!
|
|
matkus (статус: Заблокирован), 25 марта 2011, 19:00 [#7]:
У меня же, блядь, 4 по русскому было в школе?!
|
|
n1tn4tsn0k (статус: 1-ый класс), 25 марта 2011, 22:32 [#8]:
Уважаемый matkus.
http://ru.wikipedia.org/wiki/Идиотия -- вот тут о таких, как вы, написано 
Вы бы лучше проверили код, чем языком молоть исходя из своих глупых убеждений. Программа работает на ура.
|
|
Толяныч (статус: 4-ый класс), 28 марта 2011, 01:03 [#9]:
Занятые изгонянием из форума неадеквата, мы забыли юной коллеге расписать второй вариант. Пришлось рачехлить старый бук со старым 'С' и встряхнуть подзапылившиеся знания по этому предмету.
|
|
N@tySuk (статус: Посетитель), 28 марта 2011, 19:20 [#10]:
А первый вариант, что расписывал n1tn4tsn0k верный или нет???
|
|
Толяныч (статус: 4-ый класс), 29 марта 2011, 17:01 [#11]:
Попробовал - нормально работает при небольших матрицах, на 20*20 уже не то - см. приложение, а на 100*100 вообще вылетает.
Вероятно,из-за рекурсии происходит переполнение стека. Мой вариант рекурсию не использует и проще для понимания, мне кажется.
фрагмент кода
|
|
n1tn4tsn0k (статус: 1-ый класс), 29 марта 2011, 20:07 [#12]:
Что у вас за конпелятор такой, что не пережевывает рекурсию глубины 100*100? У меня на gcc компилится и запускается всполне нормально. А чем рекурсия плоха? В ФП(созданном специально для космически-больших вычислений), например, все на ней построено и ничего не вылетает.
Единственное, с чем могу согласиться, - это то, что вывод выглядит уродливо из-за отсутствия форматирования, но это легко поправить.
|
|
Толяныч (статус: 4-ый класс), 30 марта 2011, 09:38 [#13]:
n1tn4tsn0k:
Согласен, компилятор у меня старый на старой Win98 на старом буке. В настройках ставил самую большую модель памяти, кажется Large - монофигственно. Но чем объяснить, что даже на вменяемых объемах вроде 20*20 дает кривое решение ( пример у меня в приложении )? Вывод - это не проблема, я поправил.
А против рекурсии ничего не имею - например, факториал рекурсивно вычисляется на ура. Но у меня скверная привычка простые задачи решать простыми методами, да и более понятно для задавшей вопрос новичка ( новичкихи ? )
И вообще чисто эстетически - мне мой код больше нравится : стройный, как колнна войск на параде
|
|
n1tn4tsn0k (статус: 1-ый класс), 30 марта 2011, 09:55 [#14]:
Вы меня обижаете) Сейчас на парах. Приду домой, покажу свой вывод, а объясняйте уже как-нибудь сами :Р
|
|
Толяныч (статус: 4-ый класс), 30 марта 2011, 11:44 [#15]:
Перевел в Дельфи - все ОК, работает, даже на 100*100. Преимущество моего алгоритма - работает на сколь угодно слабых компах, хоть даже на микроконтроллерах 
Вопрос решен.
ЗЫ : ФП - это функциональное программирование? Или Фурье преобразование?
|
|
Толяныч (статус: 4-ый класс), 30 марта 2011, 12:37 [#16]:
Требуется помощь клуба. О моих приключениях с кодом товарища с труднопроизносимым ником описано выше. Перевел в Дельфи - работает!
Но радость была недолгой : повторный клик по кнопке даже на небольшой размерности матрицы дает черт-те что.
Вывод в Memo для уменьшения размера делаю только угловых частей матрицы.
В чем тут собака порылась ?
Но остаюсь при своем мнении, что код, зависящий от среды - не комильфо.
фрагмент кода
|
|
Вадим К (статус: Академик), 30 марта 2011, 13:16 [#17]:
как всегда ответ прост - никаких глобальных переменных и сравнения с неинициализированными элементами массива.
вот такие три строки
for i := 0 to 110 do
for j := 0 to 110 do
a[i,j] := 0;
в районе 46 строки решают проблему. А вот почему - это уже другая история
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Толяныч (статус: 4-ый класс), 30 марта 2011, 18:27 [#18]:
Чужая душа - потемки, а чужой код - тем более. Мне показалось странным при заполнении массива использовать его прежнее содержание, но это как-то осталось на периферии сознания, в глубь я не вникал, тем более что у автора массив тоже не обнуляется. Ларчик открывался просто. А я уж думал - мистика, проски внеземных инопланетян.
Мой алгоритм, выполняющий задачу просто и без затей, рулит. На сем ставлю точку.
|
5 апреля 2011, 20:28: Вопрос перемещён из тематического раздела Лабораторный практикум » Разное в раздел Лабораторный практикум » C++ модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|