Добавил:
Andrew1992
Факультет ИКСС, группа ИКВТ-61
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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;
}