马的遍历问题

#include <stdio.h>

#include <conio.h>

 

int deltai[]={2,1,-1,-2,-2,-1,1,2};

int deltaj[]={1,2,2,1,-1,-2,-2,-1};

int board[8][8];

 

/*(i,j)的出口数,和各出口号于a[]s是顺序选择着法的开始序号*/

int exitn(int i,int j,int s,int a[])

{

       int i1,j1,k,count=0;

 

       for(k=0;k<8;k++)

       {

              i1=i+deltai[(s+k)%8];

              j1=j+deltaj[(s+k)%8];

 

              if(i1>=0 && i1<8 && j1>=0 && j1<8 && board[i1][j1]==0)

                     a[count++]=(s+k)%8;

       }

 

       return count;

}

 

/*选择下一出口*/

int next(int i,int j,int s)

{

       int m,k,kk,min,a[8],b[8],temp;

 

       m=exitn(i,j,s,a);

       if(m==0) return -1;/*没有出口*/

   

       min=9;

       for(k=0;k<m;k++)

       {

              temp=exitn(i+deltai[a[k]],j+deltaj[a[k]],s,b);

              if(temp<min) /*找出有最少出口数的出口*/

              {

                     min=temp;

                     kk=a[k];

              }

       }

 

       return kk;/*返回选中的着法*/

}

 

void main()

{

       int sx,sy,i,j,step,no,start;/*start用于控制8种可能着法的选择顺序*/

       for(sx=0;sx<8;sx++)

              for(sy=0;sy<8;sy++)

              {

                     start=0;/*0号着法开始顺序执行*/

                     do

                     {

                            /*清棋盘*/

                            for(i=0;i<8;i++)

                                   for(j=0;j<8;j++)

                                          board[i][j]=0;

 

                                   board[sx][sy]=1;//出发位置

                                   i=sx;j=sy;

                                  

                                   for(step=2;step<=64;step++)

                                   {

                                          if((no=next(i,j,start))==-1) break;

                                          i+=deltai[no];

                                          j+=deltaj[no];

                                          board[i][j]=step;

                                   }

                                  

                                   if(step>64)

                                          break;

                                   start++;//前一号着法没找到解

                                  

                                  

                     }while(step<=64);

                    

                  /*输出解*/

                     for(i=0;i<8;i++)

                     {

                            for(j=0;j<8;j++)

                                   printf("%4d",board[i][j]);

                            printf("/n/n");

                     }

                    

                     getch();

                     printf("/n/n");

 

              }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值