My Carelessness

Back to your page!


Or leave your comments here.

RegendLa

导航

关于回溯与马

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

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

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

posted on 2015-05-21 18:10  最爱七  阅读(140)  评论(1编辑  收藏  举报




Thanks for your coming!
If what you read helps,I would appreciate!