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


Автор: b44 18.5.2006, 15:37
помогите развернуть матрицу по часовой стрелке в памяти а не на экране 

Автор: _hunter 18.5.2006, 15:52
не вопрос -- поможем -- спрашивай что не понятно. 

Автор: b44 18.5.2006, 15:58
код проги разворота в памяти но она чтото не разворачивает
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define b 3
void main()
{
clrscr();
randomize();
int m[b][b];
int i,j,l,k,z,a,c;

     for (i=0; i<b; i++)
     {
       for (j=0; j<b; j++)
       {
       m[i][j]=random(20)+10;
       printf("%3i",m[i][j]);
       }
       printf("\n");
     }
       printf("_________\n\n");

    l=b/2;
    if ((b%2)!=0) l=l+1;
       for (i=0; i<l; i++)
       {
           for (j=(b/2)+2; j>1; j--)
           {
          a=m[i][b-(j-1)];
          m[i][b-j+1]=m[j][i];
          c=m[b-(j-1)][b-(i-1)];
          m[b-(j-1)][b-(i-1)]=a;
          a=m[b-(i-1)][j];
          m[b-(i-1)][j]=c;
          m[j][i]=a;
           }
       }
     for (i=0; i<b; i++)
     {
       for (j=0; j<b; j++)
       {
       printf("%3i",m[i][j]);
       }
       printf("\n");
     }

getch();
}
 

Автор: likehood 18.5.2006, 17:21
не проще ли записать повёрнутую матрицу в новый массив? Затем можно этот массив скопировать в старый. Больно уж запутанный алгоритм у тебя получается. 

Автор: b44 18.5.2006, 17:32
пожалуйста напишите код, но лучше переделать написанный мной код, там ошибка в 3 и 4 цикле в диапазонах,
я перепечатал эту прогу с паскаля там она отлично работает. 

Автор: AlanG 18.5.2006, 17:38
А разве правильно использовать одинаковые глобальныйе переменные в дву циклах smile   

Автор: likehood 18.5.2006, 17:39
а может кинешь паскалевский код? Только убедительная просьба пользоваться тэгами выделения кода 

Автор: _hunter 18.5.2006, 17:40
явно не         for (j=(b/2)+2; j>1; j--) а         for (j=(b/2)+2; j>0; j--)
а четвертый -- цикл вывода. какие там ощибки? 

Автор: AlanG 18.5.2006, 18:05
Ну в принципе задачка не сложная. По логике: в разных циклах передвигать столбцы и строки, и после завершения циклов копировать матрицу, для того чтобы использовать в других. Т.е. каждый цикл изменяет соответствующую сторону.
Прикольная задача, порешаю сегодня вечером  для себя smile  

Автор: b44 18.5.2006, 19:12
Alang потом кинеш решение. Щас кину паскалевский код Uses Crt;
Const b=4;
Var M:array[1..b,1..b]of integer;
    i,j,l:byte;
    a,c:Integer;
Begin
clrscr;
randomize;
   For i:=1 to b do
     Begin
      Writeln;
      For j:=1 to b do
        Begin
         M[i,j]:=Random(90)+10;
         Write(m[i,j],' ');
        end;
     end;

     Writeln;
   l:=b div 2;
   If (b mod 2)<>0 Then l:=l+1;
   For i:=1 to l do
     For j:=(b div 2) downto 1 do
        Begin
         a:=m[i,b-(j-1)];
         m[i,b-j+1]:=m[j,i];
         c:=m[b-(j-1),b-(i-1)];
         m[b-(j-1),b-(i-1)]:=a;
         a:=m[b-(i-1),j];
         m[b-(i-1),j]:=c;
         m[j,i]:=a;
        end;
     For i:=1 to b do
       Begin
        Writeln;
        For j:=1 to b do
           Write(m[i,j],' ');
       end;
   Readln;
end.


пожалуйста помогите решить 

Автор: MAKCim 18.5.2006, 19:49
Код

void ror(int** matrix, unsigned int row, unsigned int rotates)
{
    unsigned int temp=rotates;
    while (rotates--)
    {
        int old=matrix[row][row], i;
        for (i=row; i<row+temp; i++) 
            matrix[i][row]=matrix[i+1][row];
        for (i=row; i<row+temp; i++) 
            matrix[row+temp][i]=matrix[row+temp][i+1];
        for (i=row+temp; i>row; i--) 
            matrix[i][row+temp]=matrix[i-1][row+temp];
        for (i=row+temp; i>row; i--) 
            matrix[row][i]=matrix[row][i-1];
        matrix[row][row+1]=old;
    }
}

void rotate(int** matrix, unsigned int size)
{
    for (unsigned int i=0; i<size/2; ++i)
        ror(matrix,i,size-i-1);
}

поворот матрицы на 90 град. по часовой стрелке
код не проверял  smile  и думаю есть алгоритм по-эффективнее  smile  

Автор: b44 19.5.2006, 16:49
пожалуйста лучше исправьте мой код
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define b 3
void main()
{
clrscr();
randomize();
int m[b][b];
int i,j,l,k,z,a,c;

     for (i=0; i<b; i++)
     {
       for (j=0; j<b; j++)
       {
       m[i][j]=random(20)+10;
       printf("%3i",m[i][j]);
       }
       printf("\n");
     }
       printf("_________\n\n");

    l=b/2;
    if ((b%2)!=0) l=l+1;
       for (i=0; i<l; i++)
       {
           for (j=(b/2); j>1; j--)
           {
          a=m[i][b-(j-1)];
          m[i][b-j+1]=m[j][i];
          c=m[b-(j-1)][b-(i-1)];
          m[b-(j-1)][b-(i-1)]=a;
          a=m[b-(i-1)][j];
          m[b-(i-1)][j]=c;
          m[j][i]=a;
           }
       }
     for (i=0; i<b; i++)
     {
       for (j=0; j<b; j++)
       {
       printf("%3i",m[i][j]);
       }
       printf("\n");
     }

getch();
}
   

Автор: Droll 19.5.2006, 20:25
Здесь все до безумия просто! Дело в том, что в Паскале Вы создаете массив m[1..b, 1..b], в c++ создаете массив m[0..b-1, 0..b-1], а работать продолжаете как с массивом m[1..b, 1..b]. Т.о., если исправить строчки:
Код

       for (i=0; i<l; i++)
       {
           for (j=(b/2); j>1; j--)
           {
          a=m[i][b-(j-1)];
          m[i][b-j+1]=m[j][i];
          c=m[b-(j-1)][b-(i-1)];
          m[b-(j-1)][b-(i-1)]=a;
          a=m[b-(i-1)][j];
          m[b-(i-1)][j]=c;
          m[j][i]=a;
           }
       }

на строчки:
Код

    for (i = 0; i < l; i++)
    {
        for (j = ((b/2) - 1); j >= 0; j--)
        {
               a = m[i][(b - j) - 1];
               m[i][(b - j) - 1] = m[j][i];
                c = m[(b - j) - 1][(b - i) - 1];
               m[(b - j) - 1][(b - i) - 1] = a;
               a = m[(b - i) - 1][j];
               m[(b - i) - 1][j] = c;
            m[j][i] = a;
        }
    }

 - то у меня все нормально начинает работать.

Удачи! 

Автор: b44 19.5.2006, 21:05
большое спасибо


тема закрыта! 

Автор: AlanG 20.5.2006, 10:03
Цитата

большое спасибо


тема закрыта! 

Можно еще свой пример приведу, раз уж подняли вчера smile , я думал что тема еще позовчера была закрыта.

Не линейный алгоритм:
Код

 
 int END[3][3];   //Конечная матрица, туда куда будем вписывать значения
 int ishodnik[3][3]; //Исходник, в который нужно забить начальный значения.
 for(int aaa=0; a<3; a++)
  { 
     //Сдесь забиваем матрицу
 //   ..............................................
   }

 int p=0, p2=2;                        
   int s=3;  
   int e=2; //В дальнейшем станет = 0 
   int e2=2; // В дальнейшем станет = 0
  for(int i=0; i<3; i+=2; p+=2; p2-=2; e-=2; s=3; e2-=2)
   { 
     for(int m=0; m<3; m++) 
   {
      End[m][p2] = ishodnik[p][m]; 
    }
     for(int m2=0; m2<3; m2++) 
   { 
     End[e2][--s] = ishodnik[m2][e]; 
   }   
 }

Если интересно, то логику могу расписать, так понятно будет сразу, и вообще коментируйте, вдруг ошибок полно, ветдь тоже начинающий, буду рад smile .


 

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