c++--暴力破解骑士周游

#include <iostream>

#include <cstdlib>

#include <ctime>

#include <cmath>

#include <algorithm>

using namespace std;

int timess[1000];//储存骑士每个周期的行走的次数

int time1 = 0;//计算有多少个周期

int times = 0;//骑士每个周期的行走的次数

void check(int [8][8],const int[],const int[],int&,int&);

void moves(int [8][8],int [],int [],int,int&,int&);

int main()

{

    srand(time(0));

    int board[8][8] = {0};//定义一个棋盘

    const int horizontal[8] = {2,1,-1,-2,-2,-1,1,2};//定义棋子移动的类型

    const int vertical[8] = {-1,-2,-2,-1,1,2,2,1};

    int currentRow =rand()%8;//当前棋子的横坐标

    int currentColumn =rand()%8;//当前棋子的纵坐标

    int counter = 0;;//记录骑士在每一方格中移动的最近的计数

    board[currentRow][currentColumn] =1;

    for(int m=0; m<10000; m++)

    {

        for(int n=0; n<10000000; n++)

        {

            check(board,horizontal,vertical,currentRow,currentColumn);

        }

        for(int i=0; i<8; i++)

        {

            for(int j=0; j<8; j++)

            {

                cout<<board[i][j]<<” “;

            }

            cout<<endl;

        }

        cout<<endl<<endl;

        for(int p=0; p<8; p++)

        {

            for(int q=0; q<8; q++)

            {

                board[p][q]=0;

            }

        }

        currentRow =rand()%8;

        currentColumn =rand()%8;

        board[currentRow][currentColumn] =1;

        times = 0;

        time1++;

    }

    cout<<endl<<endl;

    sort(timess,timess+1000);

    cout<<timess[999];

    return 0;

}

void check(int board[8][8],const int horizontal[],const int vertical[],int&currentRow,int&currentColumn)

{

    int currentrow;

    int currentcolumn;

    int usefulrow[8]= {0}; //有效的移动类型行数

    int usefulcolumn[8]= {0}; //有效的移动类型列数

    int rcsize =0;//有效的移动类型数组的大小

    bool flag;//用于判断是否为有效的移动类型

    //此循环用于判断移动的类型

    for(int i=0; i<8; i++)

    {

        flag = true;

        //***********************

        if(horizontal[i]<0)//判断移动的方向

        {

            currentcolumn = -1;

        }

        else

        {

            currentcolumn = 1;

        }

        if(vertical[i]<0)

        {

            currentrow = -1;

        }

        else

        {

            currentrow = 1;

        }

        //***************************************************************

        //此while循环用于判断每移动一列是否已经走过

        if((currentColumn+horizontal[i]<0)||(currentColumn+horizontal[i]>7))//用于判断是否超过边界

        {

            flag = false;

            continue;

        }

        while(fabs(currentcolumn)!=(fabs(horizontal[i])+1))

        {

            if(board[currentRow][currentColumn+currentcolumn]!=0)

            {

                flag = false;

                break;

            }

            if(horizontal[i]<0)

            {

                currentcolumn–;

            }

            else

            {

                currentcolumn++;

            }

        }

        if(horizontal[i]<0)

        {

            currentcolumn++;

        }

        else

        {

            currentcolumn–;

        }

        //*****************************************************************

        //此while循环用于判断每移动一行是否已经走过

        if(!flag)

        {

            continue;

        }

        while(fabs(currentrow)!=(fabs(vertical[i])+1))

        {

            if((currentRow+vertical[i]<0)||(currentRow+vertical[i]>7))

            {

                flag = false;

                break;

            }

            if(board[currentRow+currentrow][currentColumn]!=0)

            {

                flag = false;

            }

            if(vertical[i]<0)

            {

                currentrow–;

            }

            else

            {

                currentrow++;

            }

        }

        if(vertical[i]<0)

        {

            currentrow++;

        }

        else if(vertical[i]>0)

        {

            currentrow–;

        }

        //**************************************************

        //用于记录每个有效的移动的类型并用usefulrow,usefulcolumn分别记录

        if(flag)

        {

            usefulrow[rcsize] = vertical[i];

            usefulcolumn[rcsize] = horizontal[i];

            rcsize++;

        }

    }

    //************************************************************

    if(rcsize!=0)

    {

        moves(board,usefulrow,usefulcolumn,rcsize,currentRow,currentColumn);

    }

    else

    {

        return;

    }

}

void moves(int board[8][8],int usefulrow[],int usefulcolumn[],int rcsize,int&currentRow,int&currentColumn)

{

    times++;

    timess[time1] = times;

    srand(time(0));

    int nums = rand()%rcsize;//随机获取一种有效的移动类型

    int row = usefulrow[nums];//获取到移动的行数

    int column = usefulcolumn[nums];//获取到的移动的列数

    int counterrow;

    int countercolumn;

    if(row>0)

    {

        counterrow = 1;

    }

    else

    {

        counterrow = -1;

    }

    if(column>0)

    {

        countercolumn = 1;

    }

    else

    {

        countercolumn = -1;

    }

    while(fabs(countercolumn)!=(fabs(column)+1))

    {

        board[currentRow][currentColumn+countercolumn] = 1;

        if(column>0)

        {

            countercolumn++;

        }

        else

        {

            countercolumn–;

        }

    }

    currentColumn+=column;//修改骑士的当前所在列数

    while(fabs(counterrow)!=(fabs(row)+1))

    {

        board[currentRow+counterrow][currentColumn] = 1;

        if(row>0)

        {

            counterrow++;

        }

        else

        {

            counterrow–;

        }

    }

    currentRow+=row;//修改骑士当前所在的行数

}

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/qq_41682681/article/details/80917695
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞