马踏棋盘算法

问题定义:

将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。

思路:

 利用回溯法的思想,马的走法总共有8,c[8]={1,2,1,2,-1,-2,-1,-2},b[8]={2,1,-2,-1,2,1,-2,-1},c是横坐标,b是纵坐标。总共有64步,利用这么多的条件就可以得出是否可走的条件。另外关键的一点是递归结束后,把a[i][j]归零,因为这一步是以后其他走法的必经一步,所以要归零。而在八皇后问题中,不存在走回来的,它默认的有个顺序,即数组下标顺序,而马走日是有可能走回来的。

代码实现

#include<stdio.h> 
int m=8,n=8,a[8][8];
int c[8]={1,2,1,2,-1,-2,-1,-2},b[8]={2,1,-2,-1,2,1,-2,-1},num=0,sum=0;
int check(int i,int j){//b,c数组表示每次走的横坐标,纵坐标需要加上的数。a表示整个棋盘。
    if(a[i][j]!=0||i>=m||j>=n||i<0||j<0)//判断是否出界和坐标是否走过 
      return 0;                //num表示走的步数,总共不能超过棋盘总步数64步 
    return 1; 
}
void magosun(int i,int j){
    int k;
    if(num<64){
        for(k=0;k<8;k++){
            if(check(i,j)){
                a[i][j]=1;
                num++;
                magosun(i+c[k],j+b[k]);  
                a[i][j]=0;   //关键地方,因为曾经走过的可能是下一种走法要走的,要归0 
            } 
        }
    }
    else{
        sum++;          //sum表示有多少种做法 
    }
}
int main(){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            a[i][j]=0;
        }
    } 
    magosun(0,0);   //从0,0坐标开始 
    printf("%d",sum);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在学习深度优先搜索算法,接触到了马踏棋盘,决定尝试一下。 涉及算法:递归,回溯法,深度优先搜索算法 题目需求:...
    凤凰城的传说阅读 2,030评论 1 4
  • 由于今天的马踏棋盘算法并不是使用OC编写,所以,今天的标题也就不是"使用OC....."了,下面直接开始我们的正题...
    再见远洋阅读 1,432评论 0 2
  • 图的深度优先遍历思想 图的遍历通常有两种遍历次序方案: 深度优先遍历和广度优先遍历。深度优先遍历(DepthFir...
    AceKitty阅读 3,260评论 1 4
  • 需求 将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64...
    beed0c3eb989阅读 5,624评论 0 3
  • 【3】 Cooking together(substantial) quarrel(helpless) silen...
    243李楠阅读 244评论 2 0