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

网友投稿 556 2022-05-28

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源

程序员技术交流①群:736386324 ,程序员技术交流②群:371394777

题目要求:

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

马的走法就是以下几种

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

回溯法:

之前我们谈过回溯法,还是那句话,指导思想很简单,就是一条路走到黑,碰壁了再回来一条路走到黑......一般和递归可以很好的搭配使用,还有 深度优先搜索(DFS)。

哈密尔顿路径:

图G中的哈密尔顿路径指的是经过图G中每个顶点,且只经过一次的一条轨迹。如果这条轨迹是一条闭合的路径(从起点出发不重复地遍历所有点后仍能回到起始点),那么这条路径称为哈密尔顿回路。

TravelChessBoard.c

#include 

#include 

#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 )

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

{

*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 语言 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:驾驭千级节点——揭秘PUMA大规模集群能力(四) ---- 云上测试及结论
下一篇:【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件
相关文章