Обход матрицы змейкой

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
djeak11
Сообщения: 4
Зарегистрирован: 04 апр 2016, 22:02

Сама матрица:

4 5 11 15
10 3 6 12
14 9 2 7
16 13 8 1

Суть программы должна быть в том чтобы вывести по порядку числа в данном случае 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15( через главную диагональ и по кривым )

Составил программу я понял что она ходит по вихрю как переделать чтоб она по заданию шла?

Код: Выделить всё

#include "stdafx.h"
#include <iomanip>
#include <conio.h>
#include <iostream>
using namespace std;

int main()

{
int p, j, i;

const int N = 4;

static int arr[N][N] = { { 4, 5, 11, 15 },//вводим матрицу

{ 10, 3, 6, 12 },

{ 14, 9, 2, 7 },

{ 16, 13, 8, 1 } };



for (p = 0; p<N / 2; p++) 

{
for (j = p; j <= N - p - 1; j++) 

cout << setw(4) << arr[p][j];



for (i = p + 1; i<N - p; i++) 

cout << setw(4) << arr[i][N - p - 1];



for (j = N - p - 2; j >= p; j--) 

cout << setw(4) << arr[N - p - 1][j];



for (i = N - p - 2; i >= p + 1; i--) 

cout << setw(4) << arr[i][p];



}

getchar();

return 0;

}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Что-то не очень понятно, что значит "ходит во вихрю". Алгоритм обхода разбирать не стал, но ясно, что он неправильный хотя бы потому, что обход начинается с элемента [0][0], хотя должен начинаться с элемента [3][3]. Наверное, тебе стоит просто написать друг за другом индексы элементов в правильном порядке и увидеть в этих индексах закономерность.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Такая задача уже обсуждалась на форуме. Можешь посмотреть её здесь...
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

В той теме движение змейкой несколько иначе должно быть организовано, но приёмы да, можно подсмотреть.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Вот вариант алгоритма, который обходит матрицу "по вихрю", но он тоже начинается с элемента [0][0]. В данном контексте это не принципиально, главное понять принцип работы самого алгоритма. Потом уже можно будет его модифицировать, чтобы обход начинался в правого нижнего элемента матрицы.

Код: Выделить всё

	const short N = 4; // Размерность матрицы

	int M[N][N] = {0}; // Матрица
	int A[N*N]  = {0}; // Массив
	
	// { Заполнение матрицы числами... }

	short i = 0;	// Индекс массива
	for (short n = 0; n < N; n++)
	{
		if (n > 0)
		{
			short m = N-n;
			while (m--)
			{
				A[i++] = M[n+m][m];
			}
		}
		short l = n;
		for (short k = 0; k < N-n; k++)
		{
			A[i++] = M[k][l++];
		}
	}

	// { Вывод элементов матрицы... }

	// { Вывод элементов массива... }
Это результаты выполнения программы...

[HTML] 1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

1 6 11 16 15 10 5 2 7 12 14 9 3 8 13 4[/HTML]
Это для матрицы 4x4


[HTML] 1 2 3

4 5 6

7 8 9

1 5 9 8 4 2 6 7 3[/HTML]
Это для матрицы 3x3

[HTML] 1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

1 7 13 19 25 24 18 12 6 2 8 14 20 23 17 11 3 9 15 22 16 4 10 21 5[/HTML]
А вот результат для матрицы размером 5x5
Поумнеть несложно, куда труднее от дури избавиться.
Ответить