大话数据结构C语言43 图的应用 - 马踏棋盘算法

Posted 是CodeAllen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话数据结构C语言43 图的应用 - 马踏棋盘算法相关的知识,希望对你有一定的参考价值。

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源
程序员技术交流①群:736386324 ,程序员技术交流②群:371394777    

题目要求:
国际象棋的棋盘为8*8的方格棋盘,现将“马”放在任意指定的方格中,按照“马”走棋的规则将“马”进行移动。要求每个方格只能进入一次,最终使得“马”走遍棋盘64个方格。
 
马的走法就是以下几种

 
对于在n*n的棋盘上,当n>=5且为偶数的时候,以任意点作点都有解

 
 
回溯法:
之前我们谈过回溯法,还是那句话,指导思想很简单,就是一条路走到黑,碰壁了再回来一条路走到黑......一般和递归可以很好的搭配使用,还有 深度优先搜索(DFS)
哈密尔顿路径:
图G中的哈密尔顿路径指的是经过图G中每个顶点,且只经过一次的一条轨迹。如果这条轨迹是一条闭合的路径(从起点出发不重复地遍历所有点后仍能回到起始点),那么这条路径称为哈密尔顿回路。
 
 
 
 
TravelChessBoard.c
#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");
}

// 深度优先遍历棋盘
// (x,y)为位置坐标
// tag是标记变量,每走一步,tag+1
int TravelChessBoard(int x, int y, int tag)
{
    int x1=x, y1=y, flag=0, count=0;
    
    chess[x][y] = tag;

    // 如果tag==X*Y,则完成整个棋盘的遍历
    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("\\n本次计算一共耗时: %f秒\\n\\n", (double)(finish-start)/CLOCKS_PER_SEC);

    return 0;
}

 

以上是关于大话数据结构C语言43 图的应用 - 马踏棋盘算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(图的遍历和马踏棋盘算法)

数据结构(图的遍历和马踏棋盘算法)

马踏棋盘(骑士周游问题)

Day600&601.马踏棋盘算法 -数据结构和算法Java

程序员常用 10 种算法之马踏棋盘算法

[C语言][数据结构]马踏棋盘问题