Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Игры разума
Перезагрузить страницу Интересная задачка как ее написать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
r00f r00f вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.10.2005
По умолчанию Интересная задачка как ее написать - 08.12.2005, 01:57

помню еще в школе задали такую задачку....
весельчак был препод, еще олдскульный видать - дал мальцам такую задачу....

вопщем, ее смысл.
есть масив 8х8
заполняецо против часовой стрелки по спирали вовнутрь.
хм. ну и выразился. щас опишу
1 28 27 26 25 24 23 22
2 29.......................21
3............................20
4............................19
5............................18
6............................17
7............................16
8 9 10 11 12 13 14 15

ну и т.п.
принцип, думаю, понятен.
итак, массив нужно заполнить в один цикл. ну, два, для перебора двумерного массива всетаки.
я уж скока ломал себе голову... строил многостраничные алгоритмы, с тремя переменными-флагами, еще чето помню выдумывал...
канеш решение нашел. но не считаю его приемлемым (да и потерял давно).

если данная программа гдето выложена как классический пример, укажите плз на ссылку.
если кто-то имеет решение или решил изящно и красиво - поделитесь плз.
уже 7 лет мучаюсь идеей. видимо не судьба мне писать изящные алгоритмы :/
Ответить с цитированием
  (#2 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 08.12.2005, 07:13

Да, действительно, у меня задача такого класса решена в 3 цикла
Чтобы сделать одним циклом, нужно работать с двумерным массивом как с одномерным - тогда придется вскрывать последовательность
Ответить с цитированием
  (#3 (permalink)) Старый
r00f r00f вне форума
Member
 
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.10.2005
По умолчанию 08.12.2005, 09:37

если адресовать както типа *(a+i) где char *a[8][8], i от 0 до 63 то можно перебрать в один, думаю.

фишка, опять-таки, в нахождении алгоритма заполнения ячеек.
Ответить с цитированием
  (#4 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 08.12.2005, 11:26

Код:
int _tmain(int argc, _TCHAR* argv[])
{
    // инициализация
    int x, n=64, q=8, d=8;
    int newd[17];
    newd[0] = -1; newd[7] = 8; newd[9] = -8; newd[16] = 1;

    int a[8][8];
    for (x = 0; x < 64; x++) a[x >> 3][x & 7] = 0;

    // заполнение
    x = 0;
    while (n)
    {
        a[x >> 3][x & 7] = 65 - n--;
        x += d;
        if (!(--q) || a[x >> 3][x & 7])
        {
            x -= d;
            q = 8;
            d = newd[d+8];
            x += d;
        }
    }

    // вывод на экран
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            std::cout << a[i][j] << "  ";
        }
        std::cout << std::endl;
    }
    return 0;
}

P.S. Делов-то на 20 минут...
Ответить с цитированием
  (#5 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 08.12.2005, 22:59

Доработанная версия:
Код:
int _tmain(int argc, _TCHAR* argv[])
{
    // инициализация
    int x=0, n=64, m=15, q=8, d=8;
    int a[8][8];
    int newd[17];
    newd[0] = -1; newd[7] = 8; newd[9] = -8; newd[16] = 1;

    // заполнение
    while (n)
    {
        a[x >> 3][x & 7] = 65 - n--;
        if (!(--q))
        {
            q = (m--) >> 1;
            d = newd[d+8];
        }
        x += d;
    }

    // вывод на экран
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            std::cout << a[i][j] << "  ";
        }
        std::cout << std::endl;
    }
    return 0;
}
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Mace Windu Mace Windu вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.04.2006
По умолчанию 13.07.2006, 03:57

2michael

Ух ты, вообще в один цикл...
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная проблема Kirill Mashtaler Процессоры 10 12.01.2012 18:10
интересная программа evgen1 Pascal 15 15.12.2010 20:49
Интересная задачка на списки Gun-Down Prolog 16 07.09.2010 22:05
интересная задача n-andriy Pascal 3 24.06.2010 12:04
Есть задачка и ответ, нужно написать на прологе Dissid Prolog 5 05.03.2010 23:09
Интересная задачка hasper Prolog 35 21.12.2009 21:12
Интересная задачка DYX_56 Pascal 7 10.09.2008 21:04
Интересная проблема с ХР vitem Софт и программы 13 14.07.2008 10:55
Интересная задачка =) Gateway Prolog 5 25.01.2008 03:07
очень простая, короткая, интересная задачка Шуре Prolog 2 26.12.2007 17:16
Интересная задачка Black Monarh Pascal 6 28.12.2006 21:55
интересная задачка про позиции Светочка-красавица Prolog 1 27.12.2005 18:14



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов