【大话数据结构C语言】43 图的应用 - 马踏棋盘算法
【摘要】
欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777
题目要求:
国际象棋的棋盘为8*8的方格棋盘,现将“马”放在任意指定的方格中,按照“马”走棋的规则将“马”进行移动。要求...
欢迎关注我的公众号是【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;
-
}
文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。
原文链接:allen5g.blog.csdn.net/article/details/116573252
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)