Итеративное углубление и*


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

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

(А*, а это следующий этап моего проекта для реализации Ида*)

Вот мой код:

#include <iostream>
#include <ctime>

enum EMove {    keUp = 'w',
                keDown = 's',
                keLeft = 'a',
                keRight = 'd'};

// Function declarations
void InitializeBoard(char[4][4]);
void PrintBoard(char[4][4]);
void LocateSpace(int&, int&, char[4][4]);
void Randomize(char[4][4]);
void Move(char[4][4], const EMove);
void InitializeTestBoard(char[4][4]);
char checkWin(char[4][4], char);

int main() {
    char fBoard[4][4];
    char mode;
    int boardStates;
    int depth;
    using namespace std;

    cout << "Would you like to do Test mode, Normal Mode, or Solve Mode? Type 't' or 'n' or 's'" << endl;
    cin >> mode;

    int counter = 0;
    char isComplete = ' ';

    if (mode == 't')  //Test Mode
        {
        InitializeTestBoard(fBoard);
        do {
            counter++;
            PrintBoard(fBoard);
            cout << endl << "w = Up, s = Down, a = Left, d = Right" << endl;
            cout << endl << "A = 10, B = 11, C = 12, D = 13, E = 14, F = 15" << endl;
            char cNextMove;
            cin >> cNextMove;
            EMove eNextMove = (EMove)cNextMove;
            Move(fBoard, eNextMove);
            cout << endl;
            checkWin(fBoard, isComplete);
        } while (isComplete == 'n');

            cout << "You Win!!" << endl;
            cout << "In " << counter << " moves"<< endl;
            cout << endl;
            system("PAUSE");
            return EXIT_SUCCESS;
        }
    else if (mode == 'n')  //Normal Mode
        {  
        InitializeBoard(fBoard);
        Randomize(fBoard);
        do {
            counter++;
            PrintBoard(fBoard);  
            cout << endl << "w = Up, s = Down, a = Left, d = Right" << endl;
            cout << endl << "A = 10, B = 11, C = 12, D = 13, E = 14, F = 15" << endl;
            char cNextMove;
            cin >> cNextMove;
            EMove eNextMove = (EMove)cNextMove;
            Move(fBoard, eNextMove);
            cout << endl;
            checkWin(fBoard, isComplete);
        } while (isComplete == 'n');

            cout << "You Win!!" << endl;
            cout << "In " << counter << " moves" << endl;
            cout << endl;
            system("PAUSE");
            return EXIT_SUCCESS;

        }
    else if (mode == 's')   //solve mode (Iterative Deepening Search)
        {   
        InitializeBoard(fBoard);
        Randomize(fBoard);
        do {
            PrintBoard(fBoard);  
            cout << endl << "Number of Board States: " << boardStates << endl;
            cout << endl << "Depth Level:"<< depth << endl;
            cout << endl;
            checkWin(fBoard, isComplete);
        } while (isComplete == 'n');

            cout << "Puzzle Has been solved" << endl;
            cout << "In " << boardStates << " Board States" << endl;
            cout << endl;
            system("PAUSE");
            return EXIT_SUCCESS;
}

void InitializeTestBoard(char fBoard[4][4]) {
    const char tInitial[4][4] = {
            {'1', '2', '3', '4'},
            {'5', '6', '7', '8'},
            {'9', 'A', 'B', 'C'},
            {'D', 'E', ' ', 'F'}
    };
    for (int iRow = 0; iRow < 4; ++iRow) {
        for (int iCol = 0; iCol < 4; ++iCol) {
            fBoard[iRow][iCol] = tInitial[iRow][iCol];

        }
    }
}

void InitializeBoard(char fBoard[4][4]) {
    const char fInitial[4][4] = {
            {'1', '2', '3', '4'},
            {'5', '6', '7', '8'},
            {'9', 'A', 'B', 'C'},
            {'D', 'E', 'F', ' '}
    };
    for (int iRow = 0; iRow < 4; ++iRow) {
        for (int iCol = 0; iCol < 4; ++iCol) {
            fBoard[iRow][iCol] = fInitial[iRow][iCol];

        }
    }
}

void PrintBoard(char fBoard[4][4]) {
    using namespace std;
    for (int iRow = 0; iRow < 4; ++iRow) {
        for (int iCol = 0; iCol < 4; ++iCol) {
            cout << fBoard[iRow][iCol];
        }
        cout << endl;
    }
}

void LocateSpace(int& irRow, int& irCol, char fBoard[4][4]) {
    for (int iRow = 0; iRow < 4; ++iRow) {
        for (int iCol = 0; iCol < 4; ++iCol) {
            if (fBoard[iRow][iCol] == ' ') {
                irRow = iRow;
                irCol = iCol;
            }
        }
    }
}

void Randomize(char fBoard[4][4]) {
    using namespace std;
    srand((unsigned int)time(0));
    for (int iIndex = 0; iIndex < 1000000; ++iIndex) {
        const int kiNextMove = (rand() % 4);
        switch (kiNextMove) {
            case 0:
                {
                    Move(fBoard, keUp);
                    break;
                }
            case 1:
                {
                    Move(fBoard, keDown);
                    break;
                }
            case 2:
                {
                    Move(fBoard, keLeft);
                    break;
                }
            case 3:
                {
                    Move(fBoard, keRight);
                    break;
                }
        }
    }
}

void Move(char fBoard[4][4], const EMove keMove) {
    int iRowSpace;
    int iColSpace;
    LocateSpace(iRowSpace, iColSpace, fBoard);
    int iRowMove(iRowSpace);
    int iColMove(iColSpace);
    switch (keMove) {
        case keUp:
            {
                iRowMove = iRowSpace + 1;
                break;
            }
        case keDown:
            {
                iRowMove = iRowSpace - 1;
                break;
            }
        case keLeft:
            {
                iColMove = iColSpace + 1;
                break;
            }
        case keRight:
            {
                iColMove = iColSpace - 1;
                break;
            }
    }
    // Make sure that the square to be moved is in bounds
    if (iRowMove >= 0 && iRowMove < 4 && iColMove >= 0 && iColMove < 4) {
        fBoard[iRowSpace][iColSpace]    = fBoard[iRowMove][iColMove];
        fBoard[iRowMove][iColMove]  = ' ';
    } 
}

char checkWin(char fBoard[4][4], char isComplete) 
    {
        const char fInitial[4][4] = {
            {'1', '2', '3', '4'},
            {'5', '6', '7', '8'},
            {'9', 'A', 'B', 'C'},
            {'D', 'E', 'F', ' '}
        };

        for (int i= 0; i < 5; i++)
        {
        if (fBoard[1][i] == fInitial[1][i] || fBoard[1][i] == fInitial[1][i] || fBoard[1][i] == fInitial[1][i] || fBoard[1][i] == fInitial[1][i])
        {
        isComplete = 'y';
        }
        else
        isComplete = 'n';

        if (fBoard[2][i] == fInitial[2][i] || fBoard[2][i] == fInitial[2][i] || fBoard[2][i] == fInitial[2][i] || fBoard[2][i] == fInitial[2][i])
        {
        isComplete = 'y';
        }
        else
        isComplete = 'n';

        if (fBoard[3][i] == fInitial[3][i] || fBoard[3][i] == fInitial[3][i] || fBoard[3][i] == fInitial[3][i] || fBoard[3][i] == fInitial[3][i])
        {
        isComplete = 'y';
        }
        else
        isComplete = 'n';

        if (fBoard[4][i] == fInitial[4][i] || fBoard[4][i] == fInitial[4][i] || fBoard[4][i] == fInitial[4][i] || fBoard[4][i] == fInitial[4][i])
        {
        isComplete = 'y';
        }
        else
        isComplete = 'n';
        }

        return isComplete;
    }

Любую помощь вы можете дать бы замечательно!



3081
4
c++
задан 9 ноября 2011 в 02:11 Источник Поделиться
Комментарии
1 ответ

Я вижу, что вы используете системы("пауза") он работает все хорошо и денди, но за кулисами это создает некоторые дополнительные накладные расходы, которых можно избежать, используя стандартный C++ вызовы

прочитайте эту статью для получения дополнительной информации о его...

http://www.gidnetwork.com/b-61.html

в любом случае, если вы замените его Кин.получить();
он имеет тот же эффект... это всего лишь вопрос нажатия клавиши Enter для продолжения
и если вы захотели портировать это приложение на UNIX или Mac OS Х, система пауза не сработает: вы получите один из тех "эта команда не распознается" сообщения.
так что... в заключение, изменение системы ("пауза")с Кин.получить();'s-путь, чтобы пойти

также удобочитаемость кодов может улучшиться, если вы ставите реализации функции в отдельный файл

надеюсь, что это помогло

2
ответ дан 9 ноября 2011 в 02:11 Источник Поделиться