Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как заполнить массив по спирали, начиная с центра?

20K
15 января 2007 года
Inbox
5 / / 01.01.2007
Привет всем. Помогите решить задачу!
Заполнить массив числами по возрастанию, по спирали начиная с центра. Массив двумерный (3х3, 5х5, 7х7 и т.д. нечетной размерности).

Например вот так:
7 8 9
6 1 2
5 4 3

Заранее спасибо! :)
320
15 января 2007 года
m_Valery
1.0K / / 08.01.2007
Код:
#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;
}
20K
15 января 2007 года
Inbox
5 / / 01.01.2007
Спасибо m_Valery. Буду пробовать. :)
3
15 января 2007 года
Green
4.8K / / 20.01.2000
m_Valery, зачем так сложно?
Можно значительно проще. Я уже показывал, как заполнить по спирали К центру против часовой стрелки:
http://forum.codenet.ru/showthread.php?p=130288#post130288
От центра не сложнее.

Inbox, если не хочешь учить С++. учись пользоваться поиском и научись правильно выбирать темы для постов.
547
16 января 2007 года
Hydra
488 / / 20.06.2006
от центра можно с помощью параметрического уравнения спирали в декартовой системе координат:
x=k*t*Cos(t)+x0;
y=k*t*Sin(t)+y0;
x0, y0, k - константы центра спирали и скорости ее убегания от центра - им можно подобрать методом тыка.
t - текущий угол.
3
16 января 2007 года
Green
4.8K / / 20.01.2000
:D :D :D
А почему бы не ипспользовать квантовую физику?
15K
19 января 2007 года
Sara
79 / / 04.01.2007
Хм... Забавная головоломка.
А как вам такая функция? :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;
}

Проверено с различными n.
Работает! :)
3
19 января 2007 года
Green
4.8K / / 20.01.2000
Это конкурс на самый запутанный код? :D
15K
19 января 2007 года
Sara
79 / / 04.01.2007
Цитата: Green
Это конкурс на самый запутанный код? :D



На самый короткий :D

320
19 января 2007 года
m_Valery
1.0K / / 08.01.2007
У Green самый изящный , а значит и лучший код.
Оказывается все гениальное просто :)
ToSara как Вы вывели эту формулу,поделитесь секретом .
15K
19 января 2007 года
Sara
79 / / 04.01.2007
Цитата: m_Valery
ToSara как Вы вывели эту формулу,поделитесь секретом .


Формула выведена с помощью математических преобразований. Никакие дополнительные инструменты, кроме тетради и ручки, не использовались :)

31K
23 июля 2007 года
serg76
2 / / 23.07.2007
Недавно прочитал тему.

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++;
  }


на мой взгляд код Green лучше, так как расстановка идет по спирали к тому же работает намного быстрее.
можно, например, записать предложение вписывая в каждую ячейку по слову:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог