马的遍历(多方案)

10 篇文章 0 订阅
10 篇文章 0 订阅

 

//此解法的重点在于,通过一个变量取余使得具有相同路数的可能走另一条路,优先级变化。


#include <stdio.h>
#define INF 100

int board[8][8];
int start;
int mover[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int movec[] = { 1,  2, 2, 1,-1,-2, -2, -1};

int numable(int r, int c, int nexta[])
{
 /*返回下次可以找到的增量*/
 int i, k, a, b;
 int num = 0;
 for(i = 0;i <= 7;i++)
 {
  k = (i + start) % 8;   //让具有相同值的可以换一个位置优先
  a = r + mover[k];
  b = c + movec[k];
        if(a <= 7 && a >= 0 && b >= 0 && b <= 7 && board[a][b] == 0)
  {
   nexta[num] = k;
   num++;
  }
 }
 return num;
}

int number(int r, int c)
{
 /*返回下次可以找到的增量的个数*/
 int i, k, a, b;
 int num = 0;
 for(i = 0;i <= 7;i++)
 {
   k = (i + start) % 8;
   a = r + mover[k];
   b = c + movec[k];
        if(a <= 7 && a >= 0 && b >= 0 && b <= 7 && board[a][b] == 0)
  {
   num++;
  }
 }
 return num;
}


int next(int r, int c)
{
 /*返回下次要找的增量,若是-1没有可以找的位置*/

 int nexta[8], num, num1 = 0, minNum, i, k;
 
 minNum = INF;
 num = numable(r, c, nexta);

 if(num == 0)
 {
  return -1;  //没有出口
 }
 
 for(i = 0;i <= num - 1;i++)
 {
  num1 = number(r + mover[nexta[i]], c + movec[nexta[i]]);
 
  if(num1 <= minNum)
  {
   minNum = num1;
   k = nexta[i];
  }
 }
 return k;
}

int main(int argc, char* argv[])
{
 int ber, bec;
 int step, caseCounter;
 int r, c;
 int i, j, k;
 
     printf("Please input the first node:(x y)\n");
     while(scanf("%d%d", &ber, &bec) != EOF)//接收起点
  {
  start = 0;
  caseCounter = 1;
  while(start <= 7)
  {
   //初始化
   for(i = 0;i <= 7;i++)
   for(j = 0;j <= 7;j++)
   board[i][j] = 0;
 
   r = ber;
   c = bec;

   board[r][c] = 1;//起点
   step = 2;//下一个位置

   while(1)
   {
    if(step > 64)
    {
     printf("Case %d:\n", caseCounter++);
     for(i = 0;i <= 7;i++)
     {
      for(j = 0;j <= 7;j++)
      {
       printf("%2d ", board[i][j]);
      }
      printf("\n");
     }
      start++;
      break;
    }//end if 
      k = next(r, c);

      if(k == -1)
      {
       start++;
       break;
      }
      r = r + mover[k];
      c = c + movec[k];

      board[r][c] = step;
      step++;
   }//end while(1)
  }//end while(start <= 7)
  }//end while(scanf("%d%d", &ber, &bec) != EOF)

 return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值