Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите решить задачу с матрицей, разворот матрицы на 90градусов по часов 
:(
    Опции темы
b44
Дата 18.5.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



помогите развернуть матрицу по часовой стрелке в памяти а не на экране 
PM MAIL   Вверх
_hunter
Дата 18.5.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



не вопрос -- поможем -- спрашивай что не понятно. 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
b44
Дата 18.5.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



код проги разворота в памяти но она чтото не разворачивает
#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();
}
 
PM MAIL   Вверх
likehood
Дата 18.5.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



не проще ли записать повёрнутую матрицу в новый массив? Затем можно этот массив скопировать в старый. Больно уж запутанный алгоритм у тебя получается. 
PM MAIL   Вверх
b44
Дата 18.5.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



пожалуйста напишите код, но лучше переделать написанный мной код, там ошибка в 3 и 4 цикле в диапазонах,
я перепечатал эту прогу с паскаля там она отлично работает. 
PM MAIL   Вверх
AlanG
Дата 18.5.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) AlanG - 18.5.2006, 17:39
PM MAIL   Вверх
likehood
Дата 18.5.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



а может кинешь паскалевский код? Только убедительная просьба пользоваться тэгами выделения кода 
PM MAIL   Вверх
_hunter
Дата 18.5.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
AlanG
Дата 18.5.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Ну в принципе задачка не сложная. По логике: в разных циклах передвигать столбцы и строки, и после завершения циклов копировать матрицу, для того чтобы использовать в других. Т.е. каждый цикл изменяет соответствующую сторону.
Прикольная задача, порешаю сегодня вечером  для себя smile  
PM MAIL   Вверх
b44
Дата 18.5.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



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.


пожалуйста помогите решить 
PM MAIL   Вверх
MAKCim
Дата 18.5.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

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  

Это сообщение отредактировал(а) MAKCim - 18.5.2006, 19:50


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
b44
Дата 19.5.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



пожалуйста лучше исправьте мой код
#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();
}
   
PM MAIL   Вверх
Droll
Дата 19.5.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 10.11.2004

Репутация: нет
Всего: 3



Здесь все до безумия просто! Дело в том, что в Паскале Вы создаете массив 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;
        }
    }

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

Удачи! 
PM   Вверх
b44
Дата 19.5.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 18.5.2006

Репутация: нет
Всего: нет



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


тема закрыта! 
PM MAIL   Вверх
AlanG
Дата 20.5.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Цитата

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


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

Можно еще свой пример приведу, раз уж подняли вчера 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 .


 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.