关于回溯与马

  这道题目呢,舞台被设定在被熊孩子撕剩的半边中国象棋棋盘上。

  有一匹老马,老到只能往右跳,从半张棋盘的一个角跳到对角线上的另一个点(如图a),要求输出所有可能的路线,用坐标表示。

  这个题目就非常地适合用回溯算法来解释了,类似于走迷宫,不能越界,所以我们可以得到它所有可能前进的方向(如图b)。这题目的坐标有些特别,横坐标表示的是行数(即图a中的黑色坐标),与我们平时看惯了的坐标轴不一样,所以解题时要稍微注意一下。如果不能到达终点,则返回一步,尝试另一个方向。题目很简单,先不多说别的,奉上代码如下:

 1 #include<stdio.h>
 2 int sum=0;//用于统计方法数
 3 int pos[23][7]={0};//用于储存位置的坐标
 4 int x[4]={2,1,-1,-2},y[4]={1,2,2,1};//用于表示马可以跳的方向
 5 void out(int k);//k用于计数
 6 void search(int k);//
 7 int main()
 8 {
 9     pos[1][1]=0;//起点的横坐标为0
10     pos[1][2]=0;//起点的纵坐标为0
11     search(2);//由于起点确定,从第二个位置开始探索
12     return 0;
13 }
14 void search(int k)
15 {
16     int i;
17     for(i=0;i<=3;i++)
18         if( (pos[k-1][1]+x[i]>=0) && (pos[k-1][1]+x[i]<=4) &&
19         (pos[k-1][2]+y[i]>=0) && (pos[k-1][2]+y[i]<=8) )
20         //判断是否越界
21         {
22             pos[k][1]=pos[k-1][1]+x[i];
23             pos[k][2]=pos[k-1][2]+y[i];
24             if( (pos[k][1]==4) && (pos[k][2]==8) )//判断是否到达终点
25                 out(k);
26             else
27                 search(k+1);
28         }
29 }
30 void out(int k)
31 {
32     int i;
33     sum++;//方法总数统计
34     printf("%d:\t",sum);
35     for(i=1;i<=k-1;i++)
36     {
37         if(i==1)    printf("[%d,%d]",pos[i][1],pos[i][2]);
38         else    printf("-->[%d,%d]",pos[i][1],pos[i][2]);
39     }
40     printf("-->[4,8]\n");
41 }

  代码如有错误,欢迎指出!

时间: 2024-10-14 10:54:51

关于回溯与马的相关文章

回溯8--跳马问题

回溯8--跳马问题 一.心得 二.题目及分析 三.代码及结果 1 /* 2 一边默认一个顺序,另外一边出要求 3 选书:默认按照人一个个来,选书的话就一本本选就好了 4 */ 5 #include <iostream> 6 using namespace std; 7 8 //标志数组 9 int vis[6][6]; 10 //结果数组 11 int ans[6][6]; 12 int horseRoad[9][2]={{0,0},{2,1},{1,2},{-1,2},{-2,1},{-2,

中国历史十大经典战役

中国历史十大经典战役  NO.1 牧野之战 "牧野洋洋,--时维鹰扬,凉彼武王肆伐大商,会期清明"现代人根据史书记载的天象,甚至推算出了具体时间是公元前1106年2月4日.周武王统率兵车300乘,虎贲3000人,甲士4万5千人,汇集各部落的兵力,大破商军的共约17万人于牧野. NO.2 城濮之战 面对锋芒必露的楚军,晋文公选择"退避三舍",然后集中优势兵力对于楚军3路兵马实行各个击破,最后战斗以晋文公在践土朝觐周王,会盟诸侯结束. NO.3 长平之战 秦赵为了上党的

回溯算法(马踏棋盘)

近期学习了回溯算法于是自己写了马踏棋盘的递归以及非递归方式的代码: 运行效果如下: (本人水平有限,若有不足之处欢迎大家交流)

【回溯法】马拦过河卒

问题 I: [回溯法]马拦过河卒 时间限制: 1 Sec  内存限制: 128 MB提交: 43  解决: 13[提交][状态][讨论版] 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数

sicily 1152 简单马周游 深度优先搜索及回溯算法

1152. 简单的马周游问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 在一个5 * 6的棋盘中的某个位置有一只马,如果它走29步正好经过除起点外的其他位置各一次,这样一种走法则称马的周游路线,试设计一个算法,从给定的起点出发,找出它的一条周游路线. 为了便于表示一个棋盘,我们按照从上到下,从左到右对棋盘的方格编号,如下所示: 1     2     3       4    

马踏棋盘算法递归+回溯法实现 C语言

r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt(需要提前建好). 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include<stdio.h> #include <stdlib.h> #include <time.h> #define r 2 #define c 4 int flag[r][c]={0};//存放马跳路径的二维数组 int arr[r][c]={0}; int x[8]=

马的遍历——搜索与回溯

题目描述 Description 中国象棋半张棋盘如图所示.马自左下角往右上角跳.今规定只许往右跳,不许往左跳.比如图4(a)中所示为一种跳行路线,并将所经路线打印出来. 输入输出格式 Input/output 输入格式:无输出格式: 第一行:一个整数total表示第几种跳法 第二行:0,0-->2,1-->3,3-->1,4-->3,5-->2,7-->4,8 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: 1 0,0

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的回溯编程练习 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&l