Ka的回溯编程练习 Part5|跳马,又名马的遍历2

 1 #include <stdio.h>
 2 int TheEarthLand[6][6]={0};
 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1};
 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2};
 5 int total=0;
 6 void op()
 7 {
 8     total++;
 9     printf("<Way%d>:\n",total);
10     int i,j;
11     for(i=1;i<=5;i++)
12     {
13         for(j=1;j<=5;j++)
14             printf("%d ",TheEarthLand[i][j]);
15         printf("\n");
16     }
17 }
18 void HereWeGo(int n,int x,int y) //已满足几个点
19 {
20     if(n==25) op();  //满足了25个点就输出
21     else
22     {
23         int i,Lox,Loy;  //这里的坐标储存一定要用局部变量,不然出错
24         for(i=1;i<=8;i++) //八个方向都试试
25         {
26             Lox=x+HowToGoX[i]; //先得出此步的目的坐标
27             Loy=y+HowToGoY[i];
28             if(Lox>=1&&Lox<=5&&Loy>=1&&Loy<=5&&TheEarthLand[Lox][Loy]==0)
29             {//如果坐标在棋盘内,而且这个点没来过  注意短路逻辑顺序
30                 TheEarthLand[Lox][Loy]=n+1; //记录到点
31                 HereWeGo(n+1,Lox,Loy);
32                 TheEarthLand[Lox][Loy]=0;//回复现场
33             }
34         }
35
36     }
37 }
38 int main()
39 {
40     TheEarthLand[1][1]=1; //第一个点调1
41     HereWeGo(1,1,1); //第一个点,坐标(1,1)
42     return 0;
43 }

跳马问题。在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘。

输出前5个方案及总方案数。
输出格式示例:
1    16   21   10   25
20  11   24   15    22
17  2     19   6     9
12  7     4     23   14
3   18    13   8     5

这个题主要在坐标传入的问题上需要注意:全局变量作为新坐标会导致坐标储存的混乱,必须使用局部变量储存新坐标

时间: 2024-11-03 17:43:34

Ka的回溯编程练习 Part5|跳马,又名马的遍历2的相关文章

Ka的回溯编程练习 Part2|八皇后问题

1 #include <stdio.h> 2 int AChessBlockRecorder[10]={0}/*下标层数,内容竖行*/,ThisIsMyPlace[10]={0};/*占领*/ 3 int TheTalentOfTheQueen1[25]={0}; //前一个维度代表主对角线特性,相减同 4 int TheTalentOfTheQueen2[25]={0}; 5 int total=0; 6 void output() 7 { 8 total++; 9 printf("

Ka的回溯编程练习 Part3|马的遍历

1 #include <stdio.h> 2 int board[100][3]={0},totally=0; 3 int x[4]={2,1,-1,-2},y[4]={1,2,2,1}; 4 void o(int k) //这个输出函数需要借助回溯中n的值来完成输出 5 { 6 totally++; 7 printf("%d:",totally); 8 int r; 9 for(r=1;r<=k-1;r++) 10 printf("|%d,%d|->

Ka的回溯编程练习 Part6|有重复元素的排列问题

第一个问题: 有红球4个,白球3个,黄球3个,将它们排成一排共有多少种排法 #include <stdio.h> int BallsIUsed[201]; int BallsIHave[201]={0}; int total=0; int k; void op() { int i; total++; printf("%d:",total); for(i=1;i<=k;i++) { printf("%c",BallsIUsed[i]); } prin

Ka的回溯编程练习 Part4|分配工作

设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下. 每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出. 这个主要是细节了,没什么难度 1 #include<stdio.h> 2 int MansToJobs[6][6]={{0,0,0,0,0,0},{0,13,11,10,4,7},{0,13,10,10,8,5},{0,5,9,7,7,4},{0,15,12,10,11,5},{0,10,11,8,8,4}}; 3

Ka的回溯编程练习 Part6.5|详解|有重复元素的排列问题

#include <stdio.h> #define br printf("\n"); int ans=0; char el[502]; int confirm(int i,int k) //往回比较,如果元素有相同跳过此情况 { if(i>k) { while(i>k) { if(el[i]==el[k]) return 0; k++; } } return 1; } void op(int n) { ans++; int j; for(j=0;j<=n

编程实现LINUX下目录的层层遍历

/************************************************************************* > File Name: treedir.c > Author: KrisChou > Mail:[email protected] > Created Time: Tue 19 Aug 2014 05:04:50 PM CST *****************************************************

编程之美问题之二叉树层序遍历多种解法

二叉树的层序遍历(要求区分层,例如每层遍历完输出换行) 单单层序遍历非常简单,一个队列就搞定了,但是区分层则要麻烦些.总的思路无非就是在每次print的时候,要能通过某个东西 区分出当前节点是否是一层最后一个节点,或者下一层的最后一个节点,感觉有点类似于机器学习中找个区分度明显的特征: 1.自己的解法,在单队列基础上,输入队列的数据添加一个标志 ,LevelHeaded,同时,在后面插入两个孩子的时候,判断是否这次输出的是队头,如果是的话,先插 个队头标志,再插入孩子,而且插入一次之后,后面不能

Ka的递归编程练习 Part8|回溯之二 排列组合

1 #include <stdio.h> 2 int resl[1000]={0},used[1000]={0}; 3 int n,r; 4 int tot=0; 5 void output() 6 { 7 tot++; 8 printf("<%d>:",tot); 9 int i; 10 for(i=1;i<=r;i++) 11 printf("%d ",resl[i]); 12 printf("\n"); 13

Ka的递归编程练习 Part7|素数环!

1 #include <stdio.h> 2 #include <math.h> 3 #define MAX 12 4 int used[21]={0},resl[21]={0},zs[50]={0};//used=已使用 resl=结果 zs=质数 5 int total=0; 6 void output() 7 { 8 total++; 9 printf("<%d>:",total); 10 int i; 11 for(i=1;i<=MAX