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

举报
CodeAllen 发表于 2021/10/29 23:50:18 2021/10/29
1.5k+ 0 0
【摘要】 欢迎关注我的公众号是【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

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。