码迷,mamicode.com
首页 > 其他好文 > 详细

关于回溯与马

时间:2015-05-21 19:31:16      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

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

  有一匹老马,老到只能往右跳,从半张棋盘的一个角跳到对角线上的另一个点(如图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 }

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

关于回溯与马

标签:

原文地址:http://www.cnblogs.com/LegendLa/p/4515189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!