Выведите заданную матрицу в виде спирали, разделив матрицу на циклы



бет1/7
Дата16.10.2023
өлшемі73,49 Kb.
#115868
  1   2   3   4   5   6   7

Пример. Дана прямоугольная матрица переставить столбцы таким образом, чтобы их максимальные элементы образовывали неубывающую последовательность. Разрешается использовать только дополнительный одномерный динамический массив.

#include
using namespace std;
int main() {
int i,j,imax,jmax,imin,jmin,N,M;
double min,max,b;
cout<<"N=";cin>>N;
cout<<"M=";cin>>M;
int *a=new int[N*M];
cout<<"Input Matrix A"<for(i=0;ifor(j=0;jcin>>*(a+i*M+j);
for(max=min=*a,imax=jmax=imin=jmin=i=0;ifor(j=0;j{ if ((*(a+i*M+j))>max)
{max=*(a+i*M+j); imax=i;jmax=j;}
if ((*(a+i*M+j)){min=*(a+i*M+j); imin=i;jmin=j;}}
b=*(a+imax*M+jmax);*(a+imax*M+jmax)=*(a+imin*M+jmin);
*(a+imin*M+jmin)=b;
cout<<"Output Matrix A"<for(i=0;ifor(j=0;jcout<<*(a+i*M+j)<<"\t";
delete[]a;
}
Выведите заданную матрицу в виде спирали, разделив матрицу на циклы:
Задачу можно решить, разделив матрицу на петли, квадраты или границы. Можно видеть, что элементы внешнего цикла печатаются сначала по часовой стрелке, затем печатаются элементы внутреннего цикла. Таким образом, печать элементов цикла может быть решена с помощью четырех циклов, которые печатают все элементы. Каждый цикл ‘for’ определяет движение в одном направлении вместе с матрицей. Первый цикл for представляет движение слева направо, тогда как второй обход представляет движение сверху вниз, третий представляет движение справа налево, а четвертый представляет движение снизу вверх

Следуйте приведенным шагам для решения проблемы:

  • Создайте и инициализируйте переменные k – индекс начальной строки, m – индекс конечной строки, l – индекс начального столбца, n – индекс конечного столбца

  • Выполняйте цикл до тех пор, пока не будут напечатаны все квадраты циклов.

  • При каждом обходе внешнего цикла выводите элементы квадрата по часовой стрелке.

  • Выведите верхнюю строку, т.е. выведите элементы k-й строки с индексом столбца l до n и увеличьте количество k.

  • Выведите правый столбец, т.е. выведите последний столбец или n-й столбец от индекса строки k до m и уменьшите количество на n.

  • Выведите нижнюю строку, т.е. если k < m, то выведите элементы m-1-й строки из столбца n-1 в l и уменьшите количество m

  • Выведите левый столбец, т. е. если l < n, то выведите элементы l-го столбца из m-1-й строки в k и увеличьте количество l.

Ниже приведена реализация вышеупомянутого подхода:
#include
using namespace std;
#define R 4
#define C 4

/* Driver Code */
int main()
{
int a[R][C] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };

int i, k = 0, l = 0, m =R, n =C;

/* k - starting row index
m - ending row index
l - starting column index
n - ending column index
i - iterator
*/

while (k < m && l < n) {
/* Распечатайте первую строку из оставшихся строк*/
for (i = l; i < n; ++i) {
cout << a[k][i] << " ";
}
k++;

/* Распечатать последний столбец из остальных столбцов*/
for (i = k; i < m; ++i) {
cout << a[i][ n - 1] << " ";
}
n --;

/* Распечатайте последнюю строку из оставшихся строк*/
if (k < m) {
for (i = n - 1; i >= l; --i) {
cout << a[m - 1][i] << " ";
}
m --;
}

/* Распечатать первый столбец из остальных столбцов */
if (l < n) {
for (i = m - 1; i >= k; --i) {
cout << a[i][l] << " ";
}
l++;
}
}
return 0;
}


Достарыңызбен бөлісу:
  1   2   3   4   5   6   7




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет