这道题目呢,舞台被设定在被熊孩子撕剩的半边中国象棋棋盘上。
有一匹老马,老到只能往右跳,从半张棋盘的一个角跳到对角线上的另一个点(如图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