Перестановка строк и столбцов

Уровень сложности:

Выполнить преобразование матрицы, а именно — перестановку строк и столбцов. Для  квадратной матрицы размером n переставляйте столбцы и строки таким образом, чтобы элемент матрицы с наибольшим значением, по модулю, располагался в нижнем правом углу матрицы. Заполнение исходной матрицы организовать с клавиатуры.

В этом задании приходится манипулировать только строками и столбцами двумерного массива. Заметьте, матрица квадратная, а значит количество строк и столбцов должно быть одинаково, с помощью функции abs находим модуль значения.

Например,

4 8 9 1
3 0 1 1  — это исходная матрица.
9 8 1 2
5 5 5 5

9 — наибольшее значение по модулю, находится в первой строке и в третьем столбце. Необходимо  этот элемент переместить в правый нижний угол, но мы имеем право переставлять только строки и столбцы. Отдельно элемент перемещать нельзя.

Первая итерация:

5 5 5 5
3 0 1 1  — поменяли первую и последнюю строку местами.
9 8 1 2
4 8 9 1

Вторая итерация:

5 5 5 5
3 0 1 1  — поменяли последний и предпоследний столбец местами.
9 8 2 1
4 8 1 9

И теперь элемент со значением 9 стоит в правом нижнем углу. Задача решена.

Ниже приведен код для этой задачи. Код самый простой и может усовершенствоваться (например разбиение его на несколько отдельных функций). Код прислал пользователь нашего сайта — Василий Шуверов. Огромное ему спасибо. Пользуйтесь на здоровье.

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

int main()
{

     int n,i,j, max, rij [100], kolom[100], k=0, q, x=0,y=0, hulp_1=0, hulp_2=0;
     int ** a, f=0, p,o, itteratie=1, d=0;

     /*запрос размера матрицы и выделение под нее памяти*/

     printf("specify the size of an array: ");
     scanf("%d", &n);
     printf("\n");
     a=calloc(n,sizeof(int));

     for (i=0;i<n;++i)
     {
         a[i]=calloc(n,sizeof(int));

     }

     /*заполнение матрицы случайными числами от 0 до 10 и одновременный вывод ее на экран*/

     for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {a[i][j]=rand()%10;
         printf("%-2d", a[i][j]);}
         printf("\n");
     }

     /*отыскание наибольшего элемента матрицы */

     max=a[0][0];

     for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
             if (a[i][j]>max)
             {
                 max=a[i][j];
             }
         }
     }

    /*Нахождение позиций наибольшего элемента (когда их несколько и они одинаковы) */

     for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
             if (a[i][j]==max)
             {

                 rij[k]=++i;
                 kolom[k]=++j;
                 ++k;

             --i;
             --j;
             }
         }
     }

     /*Когда наибольший элемент встречается несколько раз происходит
     отыскание координат того который уже стоит как могно ближе к правому
     нижнему углу, тем самым минимализируется число перестановок столбцов или строк*/
    q=2;

    for (i=0;i<k;++i)
    {

       if( (rij[i]+kolom[i])>q )
       {
           q=rij[i]+kolom[i];
           x=rij[i];
           y=kolom[i];

       }

    }

    /*перестановка столбцов если это необходимо  */
while(f<=n)
{

    for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
           if (j==y)

           {
               hulp_1=a[i][--j];
               a[i][j]=a[i][++j];
               a[i][j]=hulp_1;
              d=1;

           }

         }
     }
if (d)
{
     printf ("\nIteration- %d\n", itteratie++);
               for (o=0;o<n;++o)
           {
               for (p=0;p<n;++p)
               {
                   printf("%-2d", a[o][p]);
               }
               printf("\n");
           }
           d=0;
}

     ++y;
   ++f;
}
f=0;

/*перестановка строк  если это необходимо*/
while(f<=n)
{

    for (i=0;i<n;++i)
     {
         for (j=0;j<n;++j)
         {
           if (i==x)

           {
               hulp_2=a[--i][j];
               a[i][j]=a[++i][j];
               a[i][j]=hulp_2;
               d=1;

           }

         }

     }

     if (d)
{
     printf ("\nIteration- %d\n", itteratie++);
               for (o=0;o<n;++o)
           {
               for (p=0;p<n;++p)
               {
                   printf("%-2d", a[o][p]);
               }
               printf("\n");
           }
           d=0;
}

     ++x;
   ++f;
}

    return 0;
}

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. Роман Максимов

    /*
      Выполнить преобразование матрицы, а именно - перестановку строк и
      столбцов. Для квадратной матрицы размером N переставляйте столбцы
      и строки таким образом, чтобы элементы матрицы с наибольшим значением,
      по модулю, располагался в нижнем правом углу матрицы. Заполнение
      исходной матрицы организовать с клавиатуры.
    */
    //---------------------------------------------------------------------------
    #include <iostream>
    #include <iomanip>
    //---------------------------------------------------------------------------
    using namespace std;
    //---------------------------------------------------------------------------
    int main()
    {
      int column,    // меняемый столбец
          row,       // меняемая строка
          n,         // размер матрицы
          max(0),    // максимальный элемент матрицы по модулю
          val(0),    // значение матрицы которое переставляем в нижний правый угол
          **matrix;  // матрица
    
      cout << "Enter the size of the square matrix: ";
      cin >> n;
    
      try {
        matrix = new int*[n];
        for (int i = 0; i < n; i++)
          matrix[i] = new int[n];
      } catch (bad_alloc) {
        cout << "Unable to allocate memory." << endl;
        system("pause");
        return 1;
      }
    
      srand(time(NULL));
    
      cout << "Source matrix:" << endl;
    
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
          matrix[i][j] = rand() % 199 - 99; // диапазон значений [-99 ... 99]
    
          cout << setw(3) << matrix[i][j] << " ";
    
          if (max < abs(matrix[i][j])) {
            max = abs(matrix[i][j]);
            val = matrix[i][j];
            row = i;
            column = j;
          }
        }
    
        cout << endl;
      }
    
      cout << "The maximum element of the matrix modulo: " << val << endl << endl;
    
      // меняем местами строки
      for (int j = 0; j < n; j++)
        swap(matrix[row][j], matrix[n - 1][j]);
    
      // меняем местами столбцы
      for (int i = 0; i < n; i++)
        swap(matrix[i][column], matrix[i][n - 1]);
    
      cout << "Resulting matrix:" << endl;
    
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
          cout << setw(3) << matrix[i][j] << " ";
    
        cout << endl;
      }
    
      for (int i = 0; i < n; i++)
        delete [] matrix[i];
    
      delete [] matrix;
    
      system("pause");
      return 0;
    }
    //---------------------------------------------------------------------------
    
    
  2. Shini_chi

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <iomanip>
    
    using namespace std;
    
    int main ()
    {
        setlocale (LC_ALL, "rus");
        srand(time(NULL));
        int num, row, column;
        cout << "Размер массива: "; cin >> num;
        int **ptrArray = new int *[num];
            for (int i = 0; i < num; i++)
                ptrArray[i] = new int [num];
        for (int i_row = 0; i_row < num; i_row++)
        {
            for (int i_column = 0; i_column < num; i_column++)
            {
                ptrArray[i_row][i_column] = rand()%100 + 1;
                cout << setw(3) << ptrArray[i_row][i_column];
            }
            cout << endl;
        }
        int max = ptrArray [0][0];
        for (int i_row = 0; i_row < num; i_row++)
            for (int i_column = 0; i_column < num; i_column++)
                if (max < ptrArray[i_row][i_column])
                {
                    max = ptrArray[i_row][i_column];
                    row = i_row;
                    column = i_column;
                }
        int *ptrTemp = new int [num];
    
        for (int i_row = 0; i_row < num; i_row++)
            ptrTemp[i_row] = ptrArray [i_row][num-1];
        for (int i_row = 0; i_row < num; i_row++)
            ptrArray[i_row][num-1] = ptrArray[i_row][column];
        for (int i_row = 0; i_row < num; i_row++)
            ptrArray[i_row][column] = ptrTemp[i_row];
            
        for (int i_column = 0; i_column < num; i_column++)
            ptrTemp[i_column] = ptrArray[num-1][i_column];
        for (int i_column = 0; i_column < num; i_column++)
            ptrArray[num-1][i_column] = ptrArray[row][i_column];
        for (int i_column = 0; i_column < num; i_column++)
            ptrArray[row][i_column] = ptrTemp[i_column];
        cout << "\nПосле преобразований\n";
        for (int i_row = 0; i_row < num; i_row++)
        {
            for (int i_column = 0; i_column < num; i_column++)
            {
                cout << setw(3) << ptrArray[i_row][i_column];
            }
            cout << endl;
        }
        delete [] ptrTemp;
        for (int i = 0; i < num; i++)
            delete [] ptrArray[i];
    }
  3. Anufree

    #include <iostream>
    #include <vector>
    #include <ctime>
    
    using namespace std;
    
    void Input(vector<vector<int>>&, int);
    void Menu(vector<vector<int>>&, int);
    void Line(vector<vector<int>>&, int);
    void Column(vector<vector<int>>&, int);
    void Print(vector<vector<int>>&, int);
    
    int main()
    {
    	setlocale(LC_ALL, "Russian");
    	
    	int n = 0;
    	
    	cout << "\n\t\t\tВведите размер квадратной матрици: ";
    	cin >> n;
    
    	vector<vector<int>> v(n, vector<int> (n));
    
    	Input(v, n);
    	Menu(v, n);
    
    	return 0;
    }
    
    void Input(vector<vector<int>> &v, int n)
    {
    	srand(time(0));
    
    	for (int i = 0; i < n; ++i)
    	{
    		for (int j = 0; j < n; ++j)
    		{
    			v[i][j] = rand() % 10;
    		}
    	}
    	Print(v, n);
    }
    
    void Menu(vector<vector<int>> &v, int n)
    {
    	int i = 0;
    	cout << "\t\t\tВыберите действие:" << endl;
    	do
    	{
    		cout << "\t\t\t1. Поменять местами строкм матрици" << endl;
    		cout << "\t\t\t2. Поменять местами столбци матрици" << endl;
    		cout << "\t\t\t3. Выход" << endl;
    		cout << "\t\t\t";
    		cin >> i;
    		if (i == 1)
    		{
    			Line(v, n);
    			return;
    		}
    		if (i == 2)
    		{
    			Column(v, n);
    			return;
    		}
    	} while (i != 3);
    }
    
    void Line(vector<vector<int>> &v, int n)
    {
    	int a = 0, b = 0;
    	cout << "\t\t\tУкажите какие строки поменять местами" << endl;
    	cout << "\t\t\tСтрока A = "; cin >> a;
    	cout << "\t\t\tСтрока B = "; cin >> b;
    
    	for (int i = 0; i < n; ++i)
    	{
    		swap(v[a - 1][i], v[b - 1][i]);
    	}
    
    	Print(v, n);
    	Menu(v, n);
    }
    
    void Column(vector<vector<int>> &v, int n)
    {
    	int a = 0, b = 0;
    	cout << "\t\t\tУкажите какие столбци поменять местами" << endl;
    	cout << "\t\t\tСтолбец A = "; cin >> a;
    	cout << "\t\t\tСтолбец B = "; cin >> b;
    
    	for (int i = 0; i < n; ++i)
    	{
    		swap(v[i][a - 1], v[i][b - 1]);
    	}
    
    	Print(v, n);
    	Menu(v, n);
    }
    
    void Print(vector<vector<int>> &v, int n)
    {
    	for (int i = 0; i < n; ++i)
    	{
    		cout << "\t\t\t\t";
    		for (int j = 0; j < n; ++j)
    		{
    			cout << (v[i][j]) << ' ';
    		}
    		cout << endl;
    	}
    }
  4. Arthur

    #include<iostream>
    #include<ctime>
    #include <cstdlib>
    #include <iomanip>
    
    using namespace std;
    
    const int MAX_SIZE = 20;
    
    void showMass(int** , int, int);
    
    int main()
    {
        setlocale(LC_CTYPE, "rus");
        int  sz;
        while(true)
            {
                cout<<"Введите размер массива: ";
                cin >> sz;
    
                if(cin.good() && sz>0 && sz <= MAX_SIZE)
                {
                   cin.ignore(100, '\n');
                   break;
                }
              cin.clear();
              cout<<"Неправильный ввод данных\n\n";
              cin.ignore(100, '\n');
            }
    
        int** mass = new int*[sz];
        for(int x = 0; x<sz; x++)
            mass[x] = new int[sz];
        cout<<"Исходный массив:";
        srand(time(0));
        for (int i = 0; i < sz; i++)
            for (int j = 0; j < sz; j++)
                 mass[i][j] = rand() % 50;
        showMass(mass, sz, sz);
    
        int maxx = 0;
        int str  = 0;
        int col  = 0;
        for(int x = 0; x<sz; x++)
         for(int y = 0; y<sz; y++)
            if(mass[x][y] >  maxx)
             {
                maxx = mass[x][y];
                str  = x;
                col  = y;
             }
        cout<<"\n\n"<<"Максимальное значение: "<<maxx<<"\n"
               <<"строка  = "<<str<<"\n"
               <<"столбец = "<<col<<endl;
    
        cout<<"\nПерестановка строк: \n";
        swap(mass[str], mass[sz-1]);
        showMass(mass, sz, sz);
    
        cout<<"\n\nПерестановка столбцов: \n";
        for(int x = 0; x<sz; x++)
            swap(mass[x][col], mass[x][sz-1]);
        showMass(mass, sz, sz);
    
        return 0;
    }
    //////////////////////////////////////////////////////////////
    void showMass(int**arr , int m, int n)
    {
      for (int i = 0; i < m; i++)
      {
         cout<<"\n\n";
         for (int j = 0; j < n; j++)
             cout <<setw(4)<< arr[i][j] ;
      }
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.