1 Востаннє редагувалося fake (28.10.2014 18:25:42)

Тема: Заповнення матриці від центра по спіралі

Допоможіть написати на C та зробити блок-схему алгоритму.

Заповнити матрицю значеннями вектора b1, b2, ... , b81 вiд центра по спiралi: вниз - влiво - вверх - вправо. (Примiтка. На малюнку вказанi iндекси елементiв вектора b.)

Короче кажучи, треба вивести матрицю таку, як на малюнку.

http://не-дійсний-домен/i9/5ae58e59892794b3c33d41f352483ada/1414513443/2679/820385/l09_e019.gif

2

Re: Заповнення матриці від центра по спіралі

Безплатно - тільки на Хаскелі.

3 Востаннє редагувалося Joker (28.10.2014 19:33:47)

Re: Заповнення матриці від центра по спіралі

Одне із правил форуму:
3.5. Теми без будь-яких напрацювань будуть просто ігноруватись учасниками форуму, а модератори при першій можливості перенесуть їх в кошик для сміття.

Подякували: koala1

4

Re: Заповнення матриці від центра по спіралі

А ви завчасно дайте значення кожній координаті :D
matrix[2][3] = 38;

5

Re: Заповнення матриці від центра по спіралі

Є код, який вирішує трохи інше завдання. Протилежне до даного. Вивід такої матриці:
http://не-дійсний-домен/i9/9468cac514aad2056f2bf16d105baa7a/1414517922/2722/820385/l09_e018.gif

#include <stdio.h>

int main()
{
    const int n = 9;
    int A[9][9];
    int b[9 * 9];
    for (int i = 0; i < n * n; i++)
    {
        b[i] = i + 1;
    }
    int a = 0;
    for (int i = 0; i < n - 2; i++)
    {
        for (int j = i; j < n - i; j++) //вниз
        {
            A[j][i] = b[a];
            a++;
        }
        for (int j = i + 1; j < n - i - 1; j++) //вправо
        {
            A[n - i - 1][j] = b[a];
            a++;
        }
        for (int j = n - 1 - i; j > i; j--) //вверх
        {
            A[j][n - i - 1] = b[a];
            a++;
        }
        for (int j = n - 1 - i; j > i; j--) //вліво
        {
            A[i][j] = b[a];
            a++;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%2d ", A[i][j]);
        }
        printf("\n");
    }
    getch();
}

Підкажіть, що в ньому треба переробити.

6

Re: Заповнення матриці від центра по спіралі

Я б пропонував використовувати два двомірних масива, і починати писати цей двомірний масив  з останнього елементу першого(даного) масиву, а не з першого.

Прихований текст

Тому що починати з першого елемента це додатковий геморой %)

7

Re: Заповнення матриці від центра по спіралі

Тут треба більше математики, аніж знань мови С
По суті вам тре просто змінювати індекси, і найважчим тут є - вигадати алгоритм, за котрим ці індекси будуть змінюватись

8 Востаннє редагувалося Skyzerks Synx (28.10.2014 20:00:49)

Re: Заповнення матриці від центра по спіралі

fake написав:

Є код, який вирішує трохи інше завдання. Протилежне до даного. Вивід такої матриці:
http://не-дійсний-домен/i9/9468cac514aad2056f2bf16d105baa7a/1414517922/2722/820385/l09_e018.gif

#include <stdio.h>

int main()
{
    const int n = 9;
    int A[9][9];
    int b[9 * 9];
    for (int i = 0; i < n * n; i++)
    {
        b[i] = i + 1;
    }
    int a = 0;
    for (int i = 0; i < n - 2; i++)
    {
        for (int j = i; j < n - i; j++) //вниз
        {
            A[j][i] = b[a];
            a++;
        }
        for (int j = i + 1; j < n - i - 1; j++) //вправо
        {
            A[n - i - 1][j] = b[a];
            a++;
        }
        for (int j = n - 1 - i; j > i; j--) //вверх
        {
            A[j][n - i - 1] = b[a];
            a++;
        }
        for (int j = n - 1 - i; j > i; j--) //вліво
        {
            A[i][j] = b[a];
            a++;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%2d ", A[i][j]);
        }
        printf("\n");
    }
    getch();
}

Підкажіть, що в ньому треба переробити.

Вот це вже більше підходить. Тільки тут записуй елементи в зворотньому порядку. (якщо код, звісно, робочий)
P.S. індекси елементів(а не самі елементи)

9

Re: Заповнення матриці від центра по спіралі

Код робочий. Але я тільки почав вивчати Сішку. Не дуже шарю. Як ці елементи записати в зворотньому порядку? Я намагався

[i][j]

змінити місцями - не допомогло. Вектор b змінив. Він був 1...81. Став 81...1. Теж не допомогло.

10 Востаннє редагувалося FakiNyan (28.10.2014 21:28:34)

Re: Заповнення матриці від центра по спіралі

Прихований текст

Пам'ятаю, щось схоже я робив, коли тре було написати прогу для вирішення транспортної задачі. Я її так і не написав, але не тому що був дурний, а тому що не знав по якому правилу шукати значення, і шукав його по такому правилу, де тре було робити багато розгалужень, і мені було ліньки...

Ну дивіться, починаємо з центру, ага?
http://не-дійсний-домен/cujoj/9bc6b0ff07.png
Для нас головне в визначенні індексу наступної дірки це що? Вірно, напрямок!
Починаємо з напрямку вниз. Але перш ніж рухатись вниз, ми маємо перевірити, чи така дірка взагалі існує, адже ми можемо впертись в дно.
Тому перш ніж переходити на слідуючу дірку - треба перевірити, чи вона взагалі існує, і якщо не існує, то треба змінити напрямок.
А як змінити напрямок? Та дуже просто. У нас же є чітка послідовність: вниз -> вліво -> вверх -> вправо ну і знову вниз.
Гадаю, алгоритм вже зрозумілий, ага?
1) Робимо спробу двинутись в сторону (починаємо з руху вниз), перед цим перевіряємо, чи знизу є дірка.
2) Якщо дірка є - то все окей, переходимо на неї, та переходимо до пункту 1.
3) Якщо дірки немає, то залишаємось на поточному місці, змінюємо напрямок та переходимо до пункту 1.

Так, як кількість елементів матриці == кількості елементів вектору, то умовою зупинки буде рівність лічильника нулю, ну або 81, в залежності від його початкового значення та вибору між декрементом та інкрементом.

Ну а як змінювати індекси?
Ну от в моєму прикладі початок буде в точці arr[1,1] де перший індекс - номер стрічки, а другий - номер колонки (або навпаки).
Операція "вниз" означає, що номер стрічки має зменшитись на 1, тобто буде arr[0,1], ну а "вверх" - збільшення номеру стрічки, така сама срака з операціями "вліво" та "вправо", тільки там змінюємо номер стовбчика.
p.s. можу щось наплутати, бо я нє в сєбе від недосипу.
p.s.s. ах да, я зовсім не взяв до уваги умову повороту, хдд

11

Re: Заповнення матриці від центра по спіралі

fake написав:

Код робочий. Але я тільки почав вивчати Сішку. Не дуже шарю. Як ці елементи записати в зворотньому порядку? Я намагався

[i][j]

змінити місцями - не допомогло. Вектор b змінив. Він був 1...81. Став 81...1. Теж не допомогло.

Тоді пропоную вам спочатку розібратись як працюють масиви, а особливо як реалізовувати масив і як працюють індекси в цих масивах.
P.S. Ліпше почніть з  одновимірних масивів для закріплення основних понять по сортуванню елементів. Потім масив  двомірний малої розмірності (наприклад, 2х2, потім 3х3).

Подякували: FakiNyan1

12 Востаннє редагувалося Betterthanyou (28.10.2014 21:08:51)

Re: Заповнення матриці від центра по спіралі

Тримай

#include <conio.h>
#include <iostream>

using namespace std;

int main() {
    int arr[9][9] = { 0 };
    int f = 0, l = 8, k = 81;

    while (k!=0) {
        for (int i = l; f < i + 1; i--)
            arr[i][l] = k--;
        for (int i = l - 1; f < i + 1; i--)
            arr[f][i] = k--;
        for (int i = f + 1; i < l + 1; i++)
            arr[i][f] = k--;
        for (int i = f + 1; i < l; i++)
            arr[l][i] = k--;
        f++;
        l--;
    }

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++)
            cout << arr[i][j]<<"    ";
        cout << endl;
    }
    _getch();
    return 0;
}

Тільки переробиш cout на printf
і з цим

int arr[9][9] = { 0 };

в С можуть буть проблеми то попробуєш ініціалізувати через цикл

 for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
arr[i][j]=0;
Подякували: fake1