马踏棋盘问题

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%)
分享

猜你喜欢

马踏棋盘问题

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

马走日棋盘算法

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

s8lol主宰符文怎么配

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

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

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

巧解XP升Win8磁盘问题

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

lol偷钱流符文搭配推荐

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

Vista系统下提示WINDOWS没有磁盘问题原因解读

服务器
Vista系统下提示WINDOWS没有磁盘问题原因解读

分而治之算法---残缺棋盘

编程语言 网络编程
分而治之算法---残缺棋盘

lolAD刺客新符文搭配推荐

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

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

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

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

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