Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2009, 20:36   #1
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию матрицы и деревья(чистый С)

нужна помощь с двумя задачами.Помогите пожалуйста.
1) Игры.
Заполнить матрицу размера 5 на 5 цифрами (не числами) таким образом, чтобы цифры
в строках и столбцах не повторялись, совпадали суммы цифр по столбцам и по
строкам, а также были бы простыми все пятизначные числа, изображенные строками и
столбцами матрицы
2)Геометрия.
Задано n точек на плоскости. Построить дерево с вершинами в данных точках так,
чтобы была минимальной суммарная длина его рёбер.
patriarch вне форума Ответить с цитированием
Старый 25.03.2009, 20:56   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

1) попробовал прикинуть упрощённый (!) вариант: с одним повтором. А иначе-то как?! Только 4 на 4.

1 3 3 7 9
3 1 7 9 3
3 7 9 3 1
7 9 3 1 3
9 3 1 3 7

Осталось проверить полученные 5-значные числа на простоту...

А на самом деле вы (или до вас?!) что-то перепутали: простые числа (кроме числа 2) оканчиваются на 1, 3, 7 или 9. Получается, что (в тех условиях, что у вас) мы даже не можем заполнить (разными цифрами!) все 5 клеток, ибо допустимых цифр всего 4.

3 9 9 7 1
1 3 7 9 9
7 1 9 9 3
9 7 3 1 9
9 9 1 3 7

Вот, с повтором 9-ки почти получилось! Осталось только 3 числа (они выделены) не простых: 97319 = 307·317; 79913 = 157·509 и 19397 = 7·2771. Как видите, даже упрощённая задача не факт что решается. Без программы не найти! В приемлемые сроки.



2) может быть, не дерево (оно м. б. двоичным, 3-ичным... (n–1)-ичным...), а граф?!

Последний раз редактировалось Sasha_Smirnov; 26.03.2009 в 05:27.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 26.03.2009, 11:26   #3
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

Да вы правы сегодня разговаривал с преподователем.В задаче на матрицу условие простоты лишнее.А вот насчет дерева,в задачах которые нам выдали сказано дерево и преподователь тоже говорит дерево,но думаю что можно считать и граф,суть не слишком измениться...
patriarch вне форума Ответить с цитированием
Старый 27.03.2009, 00:42   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Ну тогда, условно говоря, это будет не дерево (ветвистое), а куст.

Что-то мало энтузиазма... Задачи-то классные. (А сам я на Си не пишу.)
Sasha_Smirnov вне форума Ответить с цитированием
Старый 27.03.2009, 02:15   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Раз простота чисел отпадает, то вот первая.
Притом выдает разные комбинации.

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

int check(int **M, int numi, int numj, int value)
{
int i;
for(i=numi-1;i>=0;i--)
 if(M[i][numj]==value)
  return 0;
for(i=numj-1;i>=0;i--)
 if(M[numi][i]==value)
  return 0;
return 1;
}
//------------


int main()
{
const int N = 5;
int i,j,k,l,**matr,*mas,nm=0;
int b=0,cnt=0;
srand(time(NULL));

matr = (int**)malloc(N*sizeof(int*));
for(i=0;i<N;i++)
 matr[i] = (int*)malloc(N*sizeof(int));

mas = (int*)malloc(N*sizeof(int));

//=========================
for(i=0;i<N;i++)
 {
  nm = 0;
  cnt = 0;
  for(j=0;j<N;j++)
   {
    b=0;
    while(b==0)
     {
      k = rand()%N+1;
      b = 1;
      for(l=0;l<nm;l++)
       if(k==mas[l])
        b = 0;

     } // while

    if(check(matr,i,j,k)==1)
     {
      matr[i][j] = k;
      mas[nm++] = k;
     }
    else j--;
    cnt++;
    if(cnt>=100)
     {
      i--;
      break;
     }
   } // for j


 } //for i
//---------------------------

for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
    printf("%4d",matr[i][j]);
  printf("\n");
 }


free(mas);
for(i=0;i<N;i++)
 free(matr[i]);
free(matr);

getch();
return 0;
}
Массивы сделал динамическими, потому что мне так удобнее )
Переменную b можно (даже лучше) сделать типа bool, но я сделал int для совместимости со старыми компиляторами.

upd Прикрепил исходник с экзешником.
Вложения
Тип файла: rar matrica-ars.rar (5.4 Кб, 15 просмотров)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 27.03.2009 в 02:28.
Sazary вне форума Ответить с цитированием
Старый 27.03.2009, 13:24   #6
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

Sazary спасибо огромное!но зачем закоментированные строки и мы изучаем С всего месяц и не изучали ни динамические массивы ни библиотеку <time.h> зачем она тут вообще?
patriarch вне форума Ответить с цитированием
Старый 27.03.2009, 13:41   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
зачем закоментированные строки
Для лучшей читабельности.
Цитата:
<time.h> зачем она тут вообще?
Для инициализации генератора случайных чисел.
Код:
srand(time(NULL));
Цитата:
мы изучаем С всего месяц и не изучали ни динамические массивы
Ну вот вам со статичными:
Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

int check(int *M, int n, int numi, int numj, int value)
{
int i;
for(i=numi-1;i>=0;i--)
 if(M[i*n + numj]==value)
  return 0;
for(i=numj-1;i>=0;i--)
 if(M[numi*n + i]==value)
  return 0;
return 1;
}
//------------


int main()
{
const int N = 5;
int i,j,k,l,matr[N][N],mas[N],nm=0;
int b=0,cnt=0;
srand(time(NULL));

//=========================
for(i=0;i<N;i++)
 {
  nm = 0;
  cnt = 0;
  for(j=0;j<N;j++)
   {
    b=0;
    while(b==0)
     {
      k = rand()%N+1;
      b = 1;
      for(l=0;l<nm;l++)
       if(k==mas[l])
        b = 0;

     } // while

    if(check(&matr[0][0],N,i,j,k)==1)
     {
      matr[i][j] = k;
      mas[nm++] = k;
     }
    else j--;
    cnt++;
    if(cnt>=100)
     {
      i--;
      break;
     }
   } // for j


 } //for i
//---------------------------

for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
    printf("%4d",matr[i][j]);
  printf("\n");
 }

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.03.2009, 15:56   #8
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

Цитата:
Для лучшей читабельности.
то есть их впринципе можно удалить?
Цитата:
Для инициализации генератора случайных чисел.
Это только для того чтобы выдавал разные комбинации?
patriarch вне форума Ответить с цитированием
Старый 27.03.2009, 16:07   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
то есть их впринципе можно удалить?
Да.
Цитата:
Это только для того чтобы выдавал разные комбинации?
Да. Но я бы вам советовал просто почитать про эту функцию, вместо того, чтобы удалять.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 27.03.2009 в 16:09.
Sazary вне форума Ответить с цитированием
Старый 28.03.2009, 19:20   #10
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

Извините за наглость,а со второй никто не поможет?
patriarch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение матрицы методом союзной матрицы dofmat Помощь студентам 6 03.10.2011 15:01
Чистый бинарный код НикСерг Общие вопросы C/C++ 16 09.11.2009 15:06
деревья ShenDy Общие вопросы C/C++ 0 13.03.2009 19:18
Деревья Mitron Общие вопросы Delphi 5 01.02.2008 10:09
Деревья Зёка_студент Помощь студентам 1 26.12.2007 21:47