Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
damad
Сообщений: n/a
#1

рекурсивная матрица - C++

04.06.2009, 22:04. Просмотров 647. Ответов 4
Метки нет (Все метки)

помогите пожалуйста составить код такого задания: Пусть А1, А2... последовательность квадратных матриц из нулей и единиц. такая, что порядок матрицы Аi равен 3^n.
A1=
1 0 1
0 1 0
1 0 1


при i>1 имеет место
Ai=
Ai-1 0 Ai-1
0 Ai-1 0
Ai-1 0 Ai-1


где 0 - часть матрицы, заполненная нулями.
Дано натуральное число n, построить изображение закодированное в матрице.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2009, 22:04     рекурсивная матрица
Посмотрите здесь:

C++ рекурсивная((
C++ Рекурсивная функция
Рекурсивная функция C++
Рекурсивная функция C++
Рекурсивная функция C++
C++ Рекурсивная функция
C++ Рекурсивная функция
рекурсивная задачка C++
Рекурсивная функция C++
Рекурсивная функция C++
Рекурсивная функция C++
Рекурсивная функция C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
04.06.2009, 22:27     рекурсивная матрица #2
непонятно задание.
код можно составить лишь на то, что понимаешь...
вот, допустим, есть всего три матрицы.
матрица А1 уже изображена. что будет в А2 и А3, и что надо изобразить??
Evg
Эксперт CАвтор FAQ
17268 / 5522 / 344
Регистрация: 30.03.2009
Сообщений: 15,035
Записей в блоге: 26
04.06.2009, 23:03     рекурсивная матрица #3
Код
A1:
101
010
101

A2:
101000101
010000010
101000101
000101000
000010000
000101000
101000101
010000010
101000101
Рисовать A3 руки отвалятся, по двум наверное понятно будет
Размерности A1-3x3, A2-9x9, A3-27x27

Добавлено через 3 минуты 7 секунд
На мой взгляд задание весьма интересное. Причём если подумать - то делается довольно просто. Сначала заводится матрица нужных размеров. Затем в левом верхнем углу рисуется матрица A0 (1 на 1, состоящая из еднички), Затем A0 дублируется 4 раза и 4 матрицы с нулями (всё размера 1на1) - получаем A1. Затем опять дублируем 4 раза A1 и 4 матрицы с нулями (всё размера 3на3) - получаем A2 и т.п.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
05.06.2009, 06:25     рекурсивная матрица #4
хм... ну, и непонятно как тогда ее выводить.
при n>3 она в экран не влезет.
но сам алгоритм действительно несложный.
Evg
Эксперт CАвтор FAQ
17268 / 5522 / 344
Регистрация: 30.03.2009
Сообщений: 15,035
Записей в блоге: 26
05.06.2009, 14:01     рекурсивная матрица #5
Не в моих правилах писать студентам готовые коды, но тут не удержался - уж больно задача хорошая.

C
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
 
/* Лениво делать динамический массив, сделаем статический.
 * Матрица A5 получается очень большой, так что оставим максимум для 4 */
char a[81][81];
 
/* Внутренний контроль */
#if 1
#define ASSERT(expr) \
  if (!(expr)) abort();
#else
#define ASSERT(expr)
#endif
 
/* Вычисление 3^n */
static int
pow3 (int n)
{
  int res = 1;
 
  while ((n--) != 0)
    res *= 3;
 
  return res;
}
 
/* Построение локальной матрицы A<range> в общем массиве начиная
 * с поля x, y. Построение НЕ является полностью честным, т.к.
 * мы строим только заполнение единичками (предполагая, что
 * общий массив уже заполнен нулями). Сейчас просто лениво писать
 * заполнение нулями. Из-за этого для построения новой матрицы
 * надо либо принудительно обнулять массив, либо запускать программу
 * заново */
static void
build_A (int range, int x, int y)
{
  int size;
 
  ASSERT (range >=0 && range <= 4);
 
  /* Матрица нулевого порядка состоит из единственной единицы */
  if (range == 0)
    {
      a[x][y] = 1;
      return;
    }
 
  /* Размер матрицы порядка range-1 */
  size = pow3 (range - 1);
 
  /* Матрица A<n> состоит из пяти матриц A<n-1> */
  build_A (range - 1, x, y);
  build_A (range - 1, x + size * 2, y);
  build_A (range - 1, x + size, y + size);
  build_A (range - 1, x, y + size * 2);
  build_A (range - 1, x + size * 2, y + size * 2);
}
 
/* Печать матрицы */
static void
print_A (int range)
{
  int size, i, j;
 
  size = pow3 (range);
 
  for (j = 0; j < size; j++)
    {
      for (i = 0; i < size; i++)
        printf ("%d", (int)a[i][j]);
      printf ("\n");
    }
}
 
int
main (void)
{
  int range;
 
  range = 4;
  build_A (range, 0, 0);
  print_A (range);
 
  return 0;
}
Добавлено через 8 минут 31 секунду
Для наглядности можно поправить процедуру печати - так будет красивше смотреться

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void
print_A (int range)
{
  int size, i, j;
  char c[2] = { ' ', '*' };
 
  size = pow3 (range);
 
  for (j = 0; j < size; j++)
    {
      for (i = 0; i < size; i++)
        printf ("%c", c[(int)a[i][j]]);
      printf ("\n");
    }
}
Yandex
Объявления
05.06.2009, 14:01     рекурсивная матрица
Ответ Создать тему
Опции темы

Текущее время: 19:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru