#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include <iomanip>
#include <cassert>
using namespace std;
inline char *rus(char *s)
{
char *t = new char[strlen(s) + 1];
CharToOem(s,t);
return t;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<rus("\tЗаполняем массив по спирали по возрастающей")<<endl;
int row,col;
cout<<rus("введите размерность матрицы(нечетное)")<<endl;
cin>>row;
col = row;
assert(row%2!=0);
int **m = new int*[row];
for(int i=0;i<row;i++){
m = new int[col];
for(int j=0;j<col;j++)
m[j] = 0;
}
cout<<endl;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
cout<<setw(5)<<m[j];
}
cout<<endl;
}
cout<<"\n\n";
int pos = row * col; // текущая позиция
int i = 0, j = 0;
int limit[4] = {0, 0, row - 1, col - 1}, current = 1;
while (pos > 0) {
m[j] = pos;
pos--;
switch(current) {
case 1 :
if (i == limit[2]) {
limit[1]++;
current = 2;
j++;
} else i++;
break;
case 2 :
if (j == limit[3]) {
limit[2]--;
current = 3;
i--;
} else j++;
break;
case 3 :
if (i == limit[0]) {
limit[3]--;
current = 0;
j--;
} else i--;
break;
case 0 :
if (j == limit[1]) {
limit[0]++;
current = 1;
i++;
} else j--;
break;
}
}
cout<<rus("\tправильная расстановка элементов массива\n")<<endl;
for (j = 0; j < col; j++) {
for (i = 0; i < row; i++){
cout << setw(5)<<m[j];
}
cout << endl;
}
for(i=0;i<row;i++)
delete[] m; //освобождаем память
delete[] m;
return 0;
}
Как заполнить массив по спирали, начиная с центра?
Заполнить массив числами по возрастанию, по спирали начиная с центра. Массив двумерный (3х3, 5х5, 7х7 и т.д. нечетной размерности).
Например вот так:
7 8 9
6 1 2
5 4 3
Заранее спасибо! :)
Спасибо m_Valery. Буду пробовать. :)
Можно значительно проще. Я уже показывал, как заполнить по спирали К центру против часовой стрелки:
http://forum.codenet.ru/showthread.php?p=130288#post130288
От центра не сложнее.
Inbox, если не хочешь учить С++. учись пользоваться поиском и научись правильно выбирать темы для постов.
x=k*t*Cos(t)+x0;
y=k*t*Sin(t)+y0;
x0, y0, k - константы центра спирали и скорости ее убегания от центра - им можно подобрать методом тыка.
t - текущий угол.
А почему бы не ипспользовать квантовую физику?
А как вам такая функция? :D
Код:
void fill_matrix(int**a, int n)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a[j]=(n-2*i)*(n-2*i-1)+(i-j)*((i<=j)*(4*(i+j-n)+2)*(2*(i+j<=n-1)-1)+1+4*(i+j<=n-1)*(n-i-j-1))+1;
}
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a[j]=(n-2*i)*(n-2*i-1)+(i-j)*((i<=j)*(4*(i+j-n)+2)*(2*(i+j<=n-1)-1)+1+4*(i+j<=n-1)*(n-i-j-1))+1;
}
Проверено с различными n.
Работает! :)
Это конкурс на самый запутанный код? :D
Цитата: Green
Это конкурс на самый запутанный код? :D
На самый короткий :D
Оказывается все гениальное просто :)
ToSara как Вы вывели эту формулу,поделитесь секретом .
Цитата: m_Valery
ToSara как Вы вывели эту формулу,поделитесь секретом .
Формула выведена с помощью математических преобразований. Никакие дополнительные инструменты, кроме тетради и ручки, не использовались :)
to Sara насчет "На самый короткий:D "
код Green записанный короче :D
Код:
int x=size - 1;
int y=size;
int d=-1;
int r= 1;
for(int i=x; i>=0;d*=-1)
{
for(int j=i; j>=0; --j) a[x][y+=d]=r++;
for(int j=--i; j>=0; --j) a[x+=d][y]=r++;
}
int y=size;
int d=-1;
int r= 1;
for(int i=x; i>=0;d*=-1)
{
for(int j=i; j>=0; --j) a[x][y+=d]=r++;
for(int j=--i; j>=0; --j) a[x+=d][y]=r++;
}
на мой взгляд код Green лучше, так как расстановка идет по спирали к тому же работает намного быстрее.
можно, например, записать предложение вписывая в каждую ячейку по слову:)