马踏棋盘问题

Newstar军

Newstar军

2016-02-19 13:27

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的马踏棋盘问题教程,一起来看看吧!超容易上手~
#include stdio.h
  #define N 5
  void main(){
   int x,y;
   void horse(int i,int j);
   printf("Please input start position:");
   scanf("%d%d",&x,&y);
   horse(x-1,y-1);
  }
  void horse(int i,int j){
   int a[N][N]={0},start=0,
    h[]={1,2,2,1,-1,-2,-2,-1},
    v[]={2,1,-1,-2,2,1,-1,-2},
    save[N*N]={0},posnum=0,ti,tj,count=0;
   int jump(int i,int j,int a[N][N]);
   void outplan(int a[N][N]);
   a[i][j]=posnum+1;
   while(posnum=0){
    ti=i;tj=j;
    for(start=save[posnum];start8;++start){
     ti+=h[start];tj+=v[start];
     if(jump(ti,tj,a))
      break;
     ti-=h[start];tj-=v[start];
    }
    if(start8){
     save[posnum]=start;
     a[ti][tj]=++posnum+1;
     i=ti;j=tj;save[posnum]=0;
     if(posnum==N*N-1){
      //outplan(a);
      count++;
     }
    }
    else{
     a[i][j]=0;
     posnum--;
     i-=h[save[posnum>;j-=v[save[posnum>;
     save[posnum]++;
    }
   }
   printf("%5d",count);
  }
  int jump(int i,int j,int a[N][N]){
   if(iN&&i=0&&jN&&j=0&&a[i][j]==0)
    return 1;
   return 0;
  }
  void outplan(int a[N][N]){
   int i,j;
   for(i=0;iN;i++){
    for(j=0;jN;j++)
     printf("%3d",a[i][j]);
    printf("");
   }
   printf("");
   //getchar();
  }
  用回溯法得到所有的解,但效率较低,只能算出5行5列的。
展开更多 50%)
分享

猜你喜欢

马踏棋盘问题

编程语言 网络编程
马踏棋盘问题

马踏红梅的吃法

电脑网络
马踏红梅的吃法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

马走日棋盘算法

C语言教程 C语言函数
马走日棋盘算法

USB宝盒小白式修复U盘问题

电脑网络
USB宝盒小白式修复U盘问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

巧解XP升Win8磁盘问题

电脑入门
巧解XP升Win8磁盘问题

2018冰镇马踏湖的做法步骤

冰镇马踏湖
2018冰镇马踏湖的做法步骤

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

偶写的链表、堆栈、队列的集合操作------的解释补充

偶写的链表、堆栈、队列的集合操作------的解释补充

立体视觉 让您的网页“靓”起来

立体视觉 让您的网页“靓”起来
下拉加载更多内容 ↓