骑士之旅

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int main()

{

    srand( time(NULL) );

    int board[8][8];

    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};

    memset( board, 0, sizeof(board) );//全部初始化为0

    int currentRow=0;

    int currentColumn=0;//从左上角开始

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

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

    int count=0;

    int moveNumber=0;

    int StartRow=currentRow;//起点行

    int StartColumn=currentColumn;//起点列

    int testRow=0;//测试行

    int testColumn=0;//测试列

    int priorRow=0;//优先访问行

    int priorColumn=0;//优先访问列

    int sequence[8];//用随机数产生的移动类型序列

    int i=0,j=0;

    int minimum;

    while ( 1 )

    {

        minimum=8;

        sequence[0]=rand()%8;

        i=1;

        while ( i<8 )

        {

            sequence[i]=rand()%8;

            for ( j=0; j<i; ++j )

                if ( sequence[j] == sequence[i] )

                    break;

            if ( j == i)

                ++i;

        }

        StartRow=currentRow;

        StartColumn=currentColumn;

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

        {

            moveNumber=sequence[i];

            testRow=currentRow+vertical[moveNumber];

            testColumn=currentColumn+horizontal[moveNumber];

            if ( board[testRow][testColumn] == 0 && testRow>=0

                && testRow<=7 && testColumn>=0 && testColumn<=7 )//终点符合要求

            {

                if ( accessibility[testRow][testColumn] <= minimum )

                {

                    minimum=accessibility[testRow][testColumn];

                    priorRow=testRow;

                    priorColumn=testColumn;

                }

            }

        }

 

        currentRow=priorRow;//马移动到优先访问点上

        currentColumn=priorColumn;

        if ( currentRow == StartRow && currentColumn == StartColumn )//马未移动

            break;

        else

        {

            ++count;

            board[currentRow][currentColumn]=count;

            continue;

        }

    }

    for ( i=0; i<8; ++i )//打印棋盘

    {

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

            printf( "%d/t", board[i][j] );

        printf( "/n" );

    }

    printf( "The horse goes %d steps./n", count );

    return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值