Добавил:
Факультет ИКСС, группа ИКВТ-61 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB / WORK_9 / Euler / main

.cpp
Скачиваний:
28
Добавлен:
20.02.2019
Размер:
5.71 Кб
Скачать
#include <chessboard.h>                             //Заголовочный файл с прототипами функций
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
    ofstream myfile;
    myfile.open("C:/EulerApp/release/report.txt");

    if(argc>=2)
    {
        printf("\nNumber Of Arguments Passed: %d",argc);
        printf("\n----Following Are The Command Line Arguments Passed----");
        for(int xCount=0;xCount<argc;xCount++)
            printf("\nargv[%d]: %s",xCount,argv[xCount]);
    }
    srand(time(nullptr));
    ChessBoard board;

    short counter = 0;
    double probability = 0;
    long total = 0, successful = 0, upperLimit = 10000;
    if ( argc >= 2 )
    {
        if (stoi(argv[7]) != 0)
        {
            upperLimit = stoi(argv[7]);
            probability = 0;
        }
        else if (stod(argv[8]) != 0)
        {
            probability = stod(argv[8]);
            upperLimit = 0;
        }

    }
    int journeys[64] = {};

    extern short cR, cC, fR, fC;
    board.interact(argc, argv);


    do
    {
        board.initializeBoard();                        //Инициализация доски нулями

        int accessibility[8][8] =   {  {2,3,4,4,4,4,3,2},      //Инициализация доски доступности
                                       {3,4,6,6,6,6,4,3},
                                       {4,6,8,8,8,8,6,4},
                                       {4,6,8,8,8,8,6,4},
                                       {4,6,8,8,8,8,6,4},
                                       {4,6,8,8,8,8,6,4},
                                       {3,4,6,6,6,6,4,3},
                                       {2,3,4,4,4,4,3,2} };

        if (cR == 9 || cC == 9)                         //Задал ли пользователь начальные условия?
        {
            do
            {
                board.setCurrentRow(rand()%8);
                board.setCurrentColumn(rand()%8);
            }
            while (board.getCurrentRow() == fR && board.getCurrentColumn() == fC);   //проверка на совпадение начала и конца
        }
        else                  //Если пользователь задал начальные условия, то утвердим их
        {
            board.setCurrentRow(cR);
            board.setCurrentColumn(cC);
        }
        //Утвердим конечные условия. Можно было бы и раньше их утвердить
        board.finalRow = fR;
        board.finalColumn = fC;

        board.setBoard(1);           //Первый ход
        board.setAccessibility( accessibility, board.getCurrentRow(), board.getCurrentColumn() );        //Модифицировать доску доступности

        for (counter = 1; counter < 64; counter++)                //Моделирование ходов циклом
        {
            if ( board.makePossibleMove( counter, board.getCurrentRow(), board.getCurrentColumn()) == false )
                break;             //Окончить цикл, если невозможно сделать легальный ход
            board.setPosition (accessibility, counter);   //Новый ход
        }

        journeys[counter - 1]++;        //Запись количества путешествий каждой длины
        if (counter == 64)              //Если выполнено полное путешествие
        {
            successful++;           //Счётчик успешных путешествий увеличивается
        }
        total++;                        //Всего путешествий
    }
    /*"Если выполнено неполное путешествие и количество путешествий меньше 1000
                 или если начальные условия не выполняются при том, что они заданы, то выполнить цикл ещё раз"*/
    while ( (( (board.makePossibleMove(counter, board.getCurrentRow(), board.getCurrentColumn()) == false)
              && (counter < 64)&&(total < upperLimit) && upperLimit > 0 ) || (((double(successful)/total) < probability) && probability > 0))
            || !( (board.getCurrentRow() == board.finalRow &&
                board.getCurrentColumn() == board.finalColumn)
                  || (board.finalRow == 9 || board.finalColumn == 9) ));

    cout << "\n\t\tDistribution:\n";
    for (short k = 1, j = 0; k <= 64; k++)                      //Распределение путешествий коня каждой длины
    {
        cout << setw(12) << k;
        if (k % 8 == 0)
        {
            cout << endl;
            for (; j < k; j++)
                cout << setw(12) << journeys[j];
            cout << endl << endl;
        }
    }

    cout << "\n\t\tFinal board:\n";
    board.printBoard();                        //Вывод доски на экран

    if ( argc < 2 )
    {
        probability = double(successful)/total;     //Вероятность маршрута
    }
    else if ( stoi(argv[8]) == 0)
         probability = double(successful)/total;

    cout << setprecision(15) << "Probability of success = " << probability << endl;
    myfile << probability << endl;
    cout << "Total number of tours = " << total << endl;
    myfile << total << endl;
    cout << "Routes = " << successful << endl;
    myfile.close();
    getch();

    return 0;
}
Соседние файлы в папке Euler