Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++ Stack overflow 
V
    Опции темы
AliasVeter
Дата 27.9.2015, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



Рекурсивный метод решения задачи "Восемь ферзей" используя массив эвристической доступности.
Код

// task_7.26.cpp: определяет точку входа для консольного приложения.
//

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

int queenMove( int *mass[], int sizeMass, int sideMass, int row, int column )
{
    
    int control[8][8] = { 0 };
    int accessibility[8][8] = { 0 };
    static int count = 0;
    int recomendRow = 0;
    int recomendColumn = 0;
    static int powerQueen = 0;

    if (powerQueen == 8)
        return **mass;        
    else
    {
        // инициализируем массив доступности
        for (int i = 0; i < 8; i++)
        {
            accessibility[0][i] = 22;
            accessibility[7][i] = 22;
            accessibility[i][0] = 22;
            accessibility[i][7] = 22;
        }

        for (int i = 0; i < 8 - 2; i++)
        {
            accessibility[1][i + 1] = 24;
            accessibility[6][i + 1] = 24;
            accessibility[i + 1][1] = 24;
            accessibility[i + 1][6] = 24;
        }

        for (int i = 1; i < 8 - 3; i++)
        {
            accessibility[2][i + 1] = 26;
            accessibility[5][i + 1] = 26;
            accessibility[i + 1][2] = 26;
            accessibility[i + 1][5] = 26;
        }

        accessibility[3][3] = 28;
        accessibility[3][4] = 28;
        accessibility[4][3] = 28;
        accessibility[4][4] = 28;
        
        for (int i = 0; i < sizeMass; i++)
            for (int j = 0; j < sideMass; j++)
                mass[i][j] = 0;
        
        static int st_row = 0;
        static int st_column = 0;

        if (st_row == 8)
        {
            st_row = 0;
            st_column++;
            if (st_column == 8)
            {
                st_column = 0;
                cout << "Error!!!" << endl;
            }
        }

        row = st_row;
        column = st_column;
        powerQueen = 0;
        
        for (int i = 0; i < sizeMass; i++)
        {
            
            if (powerQueen > 0)
            {
                // определить клетку с минимальным индексом
                int min = 40;

                for (int i = 0; i < sizeMass; i++)
                    for (int j = 0; j < sizeMass; j++)
                        if (accessibility[i][j] < min)
                        {
                            min = accessibility[i][j];
                            recomendRow = i;
                            recomendColumn = j;
                        }

                // сделать ход
                row = recomendRow;
                column = recomendColumn;

                if (mass[row][column] != 1)
                {
                    mass[row][column] = 1;
                    powerQueen++;
                }
            }
            else
            {
                mass[row][column] = 1;
                powerQueen++;
            }
        
            // исключить клетки из массива доступности
            for (int i = 0; i < sizeMass; i++)
            {
                accessibility[row][i] = 40;
                accessibility[i][column] = 40;

                if (row + i < sizeMass && column + i < sizeMass)
                    accessibility[row + i][column + i] = 40;
            }

            for (int i = 0; i < sizeMass; i++)
                if (row + i < sizeMass && column - i >= 0)
                    accessibility[row + i][column - i] = 40;

            for (int i = 8; i > 0; i--)
                if (row - i >= 0 && column - i >= 0)
                    accessibility[row - i][column - i] = 40;

            for (int i = 8; i > 0; i--)
                if (row - i >= 0 && column + i < sizeMass)
                    accessibility[row - i][column + i] = 40;

            // отредактировать массив доступности
            for (int t = 0; t < sizeMass; t++)
                for (int y = 0; y < sizeMass; y++)
                {
                    row = t;
                    column = y;

                    if (accessibility[t][y] != 40)
                    {

                        for (int i = 0; i < sizeMass; i++)
                        {
                            if (accessibility[row][i] != 40 && control[row][i] != 1)
                            {
                                control[row][i] = 1;
                                count++;
                            }

                            if (accessibility[i][column] != 40 && control[i][column] != 1)
                            {
                                control[i][column] = 1;
                                count++;
                            }

                            if (row + i < sizeMass && column + i < sizeMass)
                                if (accessibility[row + i][column + i] != 40
                                    && control[row + i][column + i] != 1)
                                {
                                    control[row + i][column + i] = 1;
                                    count++;
                                }
                        }

                        for (int i = 0; i < sizeMass; i++)
                            if (row + i < sizeMass && column - i >= 0)
                                if (accessibility[row + i][column - i] != 40
                                    && control[row + i][column - i] != 1)
                                {
                                    control[row + i][column - i] = 1;
                                    count++;
                                }

                        for (int i = 8; i > 0; i--)
                            if (row - i >= 0 && column - i >= 0)
                                if (accessibility[row - i][column - i] != 40
                                    && control[row - i][column - i] != 1)
                                {
                                    control[row - i][column - i] = 1;
                                    count++;
                                }

                        for (int i = 8; i > 0; i--)
                            if (row - i >= 0 && column + i < sizeMass)
                                if (accessibility[row - i][column + i] != 40
                                    && control[row - i][column + i] != 1)
                                {
                                    control[row - i][column + i] = 1;
                                    count++;
                                }

                        if (count != 0)
                            accessibility[t][y] = count;

                        count = 0;

                        for (int i = 0; i < sizeMass; i++)
                            for (int j = 0; j < sizeMass; j++)
                                control[i][j] = 0;
                    }
                }
        }
        return queenMove(mass, sizeMass, sideMass, st_row++, st_column);
    }
}

int main()
{
    const int side = 8;
    int currentRow = 0;
    int currentColumn = 0;

    int **board = new int*[side];
    for (int i = 0; i < side; i++)
        board[i] = new int[side];

    
    queenMove (board, side, side, currentRow, currentColumn);
    
    // печать
    for (int i = 0; i < side; i++)
    {
        for (int j = 0; j < side; j++)
            cout << board[i][j] << " ";

        cout << endl;
    }
    cout << endl;

    system("pause");
    return 0;
}


Разобрался с кодом. Хотелось бы конструктивной критики. 

Это сообщение отредактировал(а) AliasVeter - 28.9.2015, 18:04
PM MAIL   Вверх
AliasVeter
Дата 27.9.2015, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



UPD: готово.

Это сообщение отредактировал(а) AliasVeter - 28.9.2015, 18:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.