【数据结构】马踏棋盘问题

算法要求:

国际象棋的期盼8X8方格棋盘,将马放在任意的格子中,按照马走棋的规则将马移动,要求每个方格只能进入一次,最终使得马走遍所有的64个方格。

任意位置的马下一步可以走的位置如图所示

//递归和回溯方法实现马踏棋盘
#include <stdio.h>
#include <time.h>

#define X 8
#define Y 8

int chess[X][Y];
//找到基于(x,y)位置的下一个可走的位置
int nextxy(int *x, int *y, int count)
{
    switch(count)
    {
        case 0:
            if( *x+2<=X-1 && *y-1>=0 && chess[*x+2][*y-1]==0 )
            {
                *x = *x + 2;
                *y = *y - 1;
                return 1;
            }
            break;
            
        case 1:
            if( *x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1]==0 )
            {
                *x = *x + 2;
                *y = *y + 1;
                return 1;
            }
            break;
            
        case 2:
            if( *x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2]==0 )
            {
                *x = *x + 1;
                *y = *y - 2;
                return 1;
            }
            break;
            
        case 3:
            if( *x+1<=X-1 && *y+2<=Y-1 && chess[*x+1][*y+2]==0 )
            {
                *x = *x + 1;
                *y = *y + 2;
                return 1;
            }
            break;
            
        case 4:
            if( *x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0 )
            {
                *x = *x - 2;
                *y = *y - 1;
                return 1;
            }
            break;
            
        case 5:
            if( *x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1]==0 )
            {
                *x = *x - 2;
                *y = *y + 1;
                return 1;
            }
            break;
            
        case 6:
            if( *x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0 )
            {
                *x = *x - 1;
                *y = *y - 2;
                return 1;
            }
            break;
            
        case 7:
            if( *x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2]==0 )
            {
                *x = *x - 1;
                *y = *y + 2;
                return 1;
            }
            break;
            
        default:
            break;
    }
    
    return 0;
}

void print()
{
    int i, j;
    
    for( i=0; i < X; i++ )
    {
        for( j=0; j < Y; j++ )
        {
            printf("%2d\t", chess[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int TravelChessBoard(int x, int y, int tag)
{
    int x1=x, y1=y, flag=0, count=0;
    
    chess[x][y] = tag;
    
    if( tag == X*Y )
    {
        print();
        return 1;
    }
    
    flag = nextxy(&x1, &y1, count);
    while( 0==flag && count < 7 )
    {
        count++;
        flag = nextxy(&x1, &y1, count);
    }
    
    while( flag )
    {
        if( TravelChessBoard(x1, y1, tag+1) )
        {
            return 1;
        }
        
        x1 = x;
        y1 = y;
        count++;
        
        flag = nextxy(&x1, &y1, count);
        while( 0==flag && count < 7 )
        {
            count++;
            flag = nextxy(&x1, &y1, count);
        }
    }
    
    if( 0 == flag )
    {
        chess[x][y] = 0;
    }
    
    return 0;
}

int main()
{
    int i, j;
    clock_t start, finish;
    
    start = clock();
    
    for( i=0; i < X; i++ )
    {
        for( j=0; j < Y; j++ )
        {
            chess[i][j] = 0;
        }
    }
    
    if( !TravelChessBoard(2, 0, 1) )
    {
        printf("抱歉!马踏棋盘失败了\n");
    }
    
    finish = clock();
    printf("本次计算一共耗时: %f秒\n\n", (double)(finish-start)/CLOCKS_PER_SEC);
    
    return 0;
}

打印结果如下:

(耗时操作,更换初始位置可能会造成计算时间更长,请耐心等待!!!!)

《【数据结构】马踏棋盘问题》

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