Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Заполнение матрицы


Автор: Немфоманка 10.2.2005, 17:54
Матрицу A(m,n) заполнить следующим образом. Елементу a(k,l) присвоить значение 1; елементам, окружающим его, - значение 2; елементам следующего круга значение 3 и т. д. до заполнение всей матрицы.
smile

Автор: DENNN 10.2.2005, 18:21
Сколько денег? smile
P.S. в нике вторая буква должна быть "и"

Автор: НЕмфоманка 11.2.2005, 13:55
Цитата(DENNN @ 10.2.2005, 18:21)
P.S. в нике вторая буква должна быть "и"

Какая "и"?? Я что тебе нимфоманка чтоли? smile
Мне кто-нить поможет??

Автор: Akina 11.2.2005, 14:33
Код

for i=1 to m
  for j=1 to n
     a(i,j)=(abs(k-i)+abs(l-j))/2+abs(abs(k-i)-abs(l-j))/2+1
  next j
next i


Цитата
Мне кто-нить поможет??

нет


Автор: azesmcar 11.2.2005, 15:51
Если ты волновой алгоритм пишешь то задача не совсем верна...надо заполнять до тех пор пока финиш не покроется...т.е. перестанет быть нулем...а так будет медленее но заполняться будет до краев...

Код

#include <stdio.h>
#include <string.h>

const int n = 10;
const int m = 10;

bool filled( int a[n][n] )
{
   for ( int i = 0; i < n; ++i )
   {
       for ( int j = 0; j < m; ++j )
       {
           if ( a[i][j] == 0 )
           {
               return false;
           }
       }
   }
   return true;
}

void vset( int a[n][m], int i, int j )
{
   int v = a[i][j] + 1;
   if ( i - 1 >= 0 && a[i - 1][j] == 0 ) a[i - 1][j] = v;
   if ( j - 1 >= 0 && a[i][j - 1] == 0 ) a[i][j - 1] = v;
   if ( i + 1 < n && a[i + 1][j] == 0 ) a[i + 1][j] = v;
   if ( j + 1 < m && a[i][j + 1] == 0 ) a[i][j + 1] = v;
}

void fill( int a[n][m], int si, int sj )
{
   vset(a, si, sj);
   int v = a[si][sj] + 1;
   while ( !filled( a ) )
   {
       for ( int i = 0; i < n; ++i )
       {
           for ( int j = 0; j < m; ++j )
           {
               if ( a[i][j] == v )
               {
                   vset( a, i, j );
               }
           }
       }
       ++v;
   }
}

int main()
{
   int a[n][m];
   memset( a, 0, n * m * sizeof( int ) );
   a[0][0] = 1;
   fill( a, 0, 0 );
   for ( int i = 0; i < n; ++i )
   {
       for ( int j = 0; j < n; ++j )
       {
           printf( "%d    ", a[i][j]);
       }
       printf("\n");
   }
}

Автор: Немфоманка 13.2.2005, 00:07
Спасибо!

Цитата(Akina @ 11.2.2005, 14:33)
Мне кто-нить поможет?? 

нет

Тю, сама помогла, а пишешь нет

Автор: faost 14.2.2005, 22:30
Ой-ой-ой, какие у вас страшные решения ))
Мне кажется, что я нашел более лаконичное и быстрое решение:

Код

#include <iostream.h>
#include <iomanip.h>

#define max(a, b) ((a) > (b) ? (a) : (b))

void main()
{
int **a;
int i, j;
int n;

cin >> n;
a = new int * [n];

for (i = 0; i < n; i++)
{
 a[i] = new int [n];
 for (j = 0; j < n; j++)
 {
  a[i][j] = max(i, j) + 1;
  cout << setw(3) << a[i][j];
 }
     cout << endl;
}
}



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)