Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с задачами на матрицы  (Прочитано 12152 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Xander7
Гость
« : 13-11-2005 10:18 » new

Люди, не хочу показаться наглым, но у меня снова вопрос.Мне на защите лабораторной дают всегда задачи на матрицы.Вооюще-то мне кажется, что я не полный ламер в С, но в матрицах вообще ничего не пойму. Может мне кто-то хоть суть решения обяснит. К примеру такая задача: вводиться последовательность чиселю. Нужно расположить их в матрице следующим образом:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16  Ну всмысле числа 1 2 3 4 5 ... Просто рисунок нарисовать не могу. Или дайте какую-то ссылку или главу из книги. У меня есть липпман и страуступ. Заранее спасибо
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #1 : 13-11-2005 15:37 » 

А размерность матрицы всегда будет n^2? В смысле мы имеем последовательность чисел от 1 до n^2?
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #2 : 13-11-2005 16:13 » 

Просто кажется здесь все более-менее просто.
1 Ставим в (0,0) 1;
2 Переходим на 1 элемент в право (см 4) ставим следуещее число и запускаем процедурку которая будет идти по диагонали(лево - низ), пока не достигнет левого края или низа, проставляя в ячейках последовательно числа;
3 Опускаемся на 1 элемент (см 5) ставим следуещее число и запускаем процедуру, которая идет по диагонали(право-верх) пока не достигнет правого края или верха, проставляя в ячейках последовательно числа;
4 Если нельзя перейти вправо(мы находимся на правом краю) тогда опускаемся вниз;
5 Если нельзя перейти вниз, тогда смещаемся вправо;
6 Если не проставлено число в ячейке (n-1,n-1) gogo (2);

По идее данная задачка должна решатся именно так.Правда я мог чего-то не заметить.
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #3 : 13-11-2005 16:22 » 

Просто кажется здесь все более-менее просто.
1 Ставим в (0,0) 1;
2 Переходим на 1 элемент в право (см 4) ставим следуещее число и запускаем процедурку которая будет идти по диагонали(лево - низ), пока не достигнет левого края или низа, проставляя в ячейках последовательно числа;
3 Опускаемся на 1 элемент (см 5) ставим следуещее число и запускаем процедуру, которая идет по диагонали(право-верх) пока не достигнет правого края или верха, проставляя в ячейках последовательно числа;
4 Если нельзя перейти вправо(мы находимся на правом краю) тогда опускаемся вниз;
5 Если нельзя перейти вниз, тогда смещаемся вправо;
6 Если не проставлено число в ячейке (n-1,n-1) gogo (2);

По идее данная задачка должна решатся именно так.Правда я мог чего-то не заметить.
Записан
Xander7
Гость
« Ответ #4 : 14-11-2005 12:34 » 

Я понимая алгоритм решения задачи самой по себе. Мне непонятно,как это реализовать в Си++. Я думаю, надо двумя циклами for вводить двумерный массив, где элемент строки ai, столбца - aj. Вводиться с каким-то условием про парность или непарность i или j. Если сможете, напишите фрагмент програмы, отвечающий за разные действия, или хоть типо схемы насси (не знаю как!!!), напишите програму буду просто ужасно благодарен, и это не наглость, просто понять нужно.
Записан
Xander7
Гость
« Ответ #5 : 14-11-2005 12:35 » 

Ой, посмотрел на свой ответ и кучу ошибок вдруг увидел.Сорри...
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #6 : 15-11-2005 22:11 » 

Можно попробовать
Будем щитать, что мы привязываемся к размерности матрицы.Тоесть, если размер матрицы n*n, то чисел у нас будет от 1 до N^2
#include <stdio.h>
int Counter;
int Dim;
int* Matrix;
int i=0,j=0;
int main()
 {
  printf("Введите размерность матрицы:> ");
  scanf("%i",&Dim);
  Matrix=new int[Dim*Dim];
  Counter=1;
  Matrix[i*Dim +j]=Counter;
  while(!((i==Dim-1)&&(j==Dim-1)))
   {
    GoRight();
    GoLeftAndDown();
    GoDown();
    GoRightAndUp();
   }
  return 0;
 }

void GoRight()
{
 if(j==Dim-1)
  GoDown();
 else
  j++;
}

void GoDown()
{
 if(i==Dim-1)
  GoRight();
 else
  i++;
}

void GoLeftAndDown()
 {
  while((i<Dim)&&(j>0))
  {
   Matrix[i*Dim+j]=Counter;
   Counter++;
   i++;
   j--;
  }
  if(j<0)
   j=0;
  if(i==Dim)
   i=Dim-1;
 }
дальше попробуй сам(а) по двум причинам:
1.Для практики.
2 У меня нет кончается.
Будет трудно присылай Говоруна.
Записан
Xander7
Гость
« Ответ #7 : 16-11-2005 13:30 » 

Спасибо, Sands.Щас как-раз и попробую. Надо будет правда перевести в С++, но это уже пустяки, главное вроде идею понял (если понялю... Ага :vzhik: :mrgreen:Если проблмы возникнут, обязательно спрошу
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #8 : 16-11-2005 13:58 » 

Вот полная прога. По идее даже работает.
Код:
#include <stdio.h>
#include <conio.h>

int Counter;
int Dim;
int* Matrix;
int i=0,j=0;
void GoRight();
void GoLeftAndDown();
void GoDown();
void GoRightAndUp();
int main()
 {
  printf("Введите размерность матрицы:> ");
  scanf("%i",&Dim);
  Matrix=new int[Dim*Dim];
  Counter=1;
  Matrix[i*Dim +j]=Counter;
  Counter++;
  while(!((i==Dim-1)&&(j==Dim-1)))
   {
    GoRight();
    GoLeftAndDown();
    GoDown();
    GoRightAndUp();
   }
  Matrix[Dim*Dim-1]=Counter;
  for(int i=0;i<Dim;i++)
   {
    for(int j=0;j<Dim;j++)
     printf("%4i",Matrix[i*Dim+j]);
    printf("\n");
   }
  getch();
  return 0;
 }

void GoRight()
{
 if((i==Dim-1)&&(j==Dim-1))
  return;
 if(j==Dim-1)
  GoDown();
 else
  j++;
}

void GoDown()
{
 if((i==Dim-1)&&(j==Dim-1))
  return;
 if(i==Dim-1)
  GoRight();
 else
  i++;
}

void GoLeftAndDown()
 {
  if((i==Dim-1)&&(j==Dim-1))
   return;
  while((i<Dim)&&(j>=0))
  {
   Matrix[i*Dim+j]=Counter;
   Counter++;
   i++;
   j--;
  }
  j++;
  i--;
 }

void GoRightAndUp()
 {
  if((i==Dim-1)&&(j==Dim-1))
   return;
  while((j<Dim)&&(i>=0))
  {
   Matrix[i*Dim+j]=Counter;
   Counter++;
   j++;
   i--;
  }
  i++;
  j--;
 }
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines