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

来源:互联网 发布:java basicstroke 编辑:程序博客网 时间:2024/05/05 10:09

算法要求:

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

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

//递归和回溯方法实现马踏棋盘#include <stdio.h>#include <time.h>#define X 8#define Y 8int 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;}

打印结果如下:

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

0 0
原创粉丝点击