Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: N@tySuk (статус: Посетитель)
Вопрос отправлен: 24 марта 2011, 22:50
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Толяныч

Здравствуйте, N@tySuk!

Код выглядит приблизительно так ( это на простом С, отличия будут только во вводе-выводе ).
В начале подпрограммы fill вычисляются координаты верхней и нижней точки диагоналей, а дальше проводится заполнение : на прямом проходе влево-вниз, на обратном - вправо-вверх. Начальная и конечная точки заполняются вне цикла. Просто, как вермишель.

Приложение:
  1. #include <stdio.h>
  2. #include <string.h>
  3. int Nx,Ny,N,arr[100][100] ;
  4. int ATop[100][2],ABott[100][2] ;
  5. void fill( int ny, int nx)
  6. {
  7. int ix,iy,k,ks,pr ;
  8. N= 1 ; pr = 1 ; ks = nx+ny-3 ; k=0 ; pr=0 ;
  9. for (ix = 1;ix<=ks;ix++)
  10. { if (ix<nx-1) {ATop[ix][0]=ix ; ATop[ix][1]=0 ; }
  11. else {ATop[ix][0]=nx-1 ; ATop[ix][1]=k++ ; }
  12. if (ix<ny-1) {ABott[ix][0]=0 ; ABott[ix][1]=ix ; }
  13. else {ABott[ix][0]=pr++ ; ABott[ix][1]=ny-1 ; }
  14. }
  15. arr[ny-1][nx-1]=1 ;
  16. N= 2 ; k = nx+ny-3 ;
  17. for (k=ks,pr=0;k>0;k--)
  18. {
  19. if (pr==0)
  20. for (ix=ATop[k][0],iy=ATop[k][1];ix >= ABott[k][0];ix--)
  21. arr[iy++][ix]=N++ ;
  22. else
  23. for (ix=ABott[k][0],iy=ABott[k][1];ix <= ATop[k][0];ix++)
  24. arr[iy--][ix]=N++ ;
  25. pr++ ; pr&=1 ;
  26. }
  27. arr[0][0]=nx*ny ;
  28.  
  29. }
  30.  
  31. void display(int ny, int nx)
  32. {
  33. int i,j ;
  34. for (i = 0 ; i<ny ; i++)
  35. { for (j =0 ; j<nx ; j++)
  36. { printf ( "%4d",arr[i][j]) ;}
  37. printf ("\n") ;
  38. }
  39. }
  40.  
  41. void main(void)
  42. {
  43. puts ("Row") ; scanf ("%d",&Ny) ;
  44. puts ("Col") ; scanf ("%d",&Nx) ;
  45. fill (Ny,Nx) ; display (Ny,Nx) ;
  46. }
  47.  
  48.  
  49.  
  50. Row
  51. 7
  52. Col
  53. 5
  54. 35 33 32 26 25
  55. 34 31 27 24 16
  56. 30 28 23 17 15
  57. 29 22 18 14 7
  58. 21 19 13 8 6
  59. 20 12 9 5 2
  60. 11 10 4 3 1
  61.  
  62.  


Ответ отправил: Толяныч (статус: 4-ый класс)
Время отправки: 28 марта 2011, 00:57
Оценка за ответ: 5

Комментарий к оценке: Спасибо Вам огромное!!!Вы мне очень помогли)))

Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 30 марта 2011, 18:27; участников в обсуждении: 6.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 24 марта 2011, 23:43 [#1]:

в чем собственно вопрос? Что непонятно в задании?
n1tn4tsn0k

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

N@tySuk (статус: Посетитель), 25 марта 2011, 12:37 [#4]:

А как сделать 12 вариант(диагональную змейку)и как поменять начальную точку? В языке С++ разбираюсь плохо!
matkus

matkus (статус: Заблокирован), 25 марта 2011, 18:57 [#5]:

Уважаемый n1tn4tsn0k, Ваша прога не работает (это видно без какой-либо проверки). Вы это вообще откуда взяли? Вы, типа, сами от балды нахерачили её? Сасуньте этот несчастный "исходник" себе жопу и, как говорили японцы в Южном Парке, "в жопу Вам китов"!!!
matkus

matkus (статус: Заблокирован), 25 марта 2011, 18:59 [#6]:

Бля, ошибку в слове сделал, сука!!!
matkus

matkus (статус: Заблокирован), 25 марта 2011, 19:00 [#7]:

У меня же, блядь, 4 по русскому было в школе?!
n1tn4tsn0k

n1tn4tsn0k (статус: 1-ый класс), 25 марта 2011, 22:32 [#8]:

Уважаемый matkus.
http://ru.wikipedia.org/wiki/Идиотия -- вот тут о таких, как вы, написано :)
Вы бы лучше проверили код, чем языком молоть исходя из своих глупых убеждений. Программа работает на ура.
Толяныч

Толяныч (статус: 4-ый класс), 28 марта 2011, 01:03 [#9]:

Занятые изгонянием из форума неадеквата, мы забыли юной коллеге расписать второй вариант. Пришлось рачехлить старый бук со старым 'С' и встряхнуть подзапылившиеся знания по этому предмету.
N@tySuk

N@tySuk (статус: Посетитель), 28 марта 2011, 19:20 [#10]:

А первый вариант, что расписывал n1tn4tsn0k верный или нет???
Толяныч

Толяныч (статус: 4-ый класс), 29 марта 2011, 17:01 [#11]:

Попробовал - нормально работает при небольших матрицах, на 20*20 уже не то - см. приложение, а на 100*100 вообще вылетает.
Вероятно,из-за рекурсии происходит переполнение стека. Мой вариант рекурсию не использует и проще для понимания, мне кажется.
фрагмент кода
n1tn4tsn0k

n1tn4tsn0k (статус: 1-ый класс), 29 марта 2011, 20:07 [#12]:

Что у вас за конпелятор такой, что не пережевывает рекурсию глубины 100*100? У меня на gcc компилится и запускается всполне нормально. А чем рекурсия плоха? В ФП(созданном специально для космически-больших вычислений), например, все на ней построено и ничего не вылетает.
Единственное, с чем могу согласиться, - это то, что вывод выглядит уродливо из-за отсутствия форматирования, но это легко поправить. :)
Толяныч

Толяныч (статус: 4-ый класс), 30 марта 2011, 09:38 [#13]:

n1tn4tsn0k:
Согласен, компилятор у меня старый на старой Win98 на старом буке. В настройках ставил самую большую модель памяти, кажется Large - монофигственно. Но чем объяснить, что даже на вменяемых объемах вроде 20*20 дает кривое решение ( пример у меня в приложении )? Вывод - это не проблема, я поправил.
А против рекурсии ничего не имею - например, факториал рекурсивно вычисляется на ура. Но у меня скверная привычка простые задачи решать простыми методами, да и более понятно для задавшей вопрос новичка ( новичкихи ? )
И вообще чисто эстетически - мне мой код больше нравится : стройный, как колнна войск на параде :-)
n1tn4tsn0k

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++ модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.04 сек.