马的遍历
【题目】
中国象棋半张棋盘如图4(a)所示。马自左下角往右上角跳。今规定只许往右跳,不许往左跳。比如图4(a)中所示为一种跳行路线,并将所经路线打印出来。打印格式为:0,0->2,1->3,3->1,4->3,5->2,7->4,8…
![](https://images2015.cnblogs.com/blog/1119446/201704/1119446-20170422101017915-1645387020.png)
【算法分析】
如图4(b),马最多有四个方向,若原来的横坐标为j、纵坐标为i,则四个方向的移动可表示为:
1: (i,j)→(i+2,j+1); (i<3,j<8)
2: (i,j)→(i+1,j+2); (i<4,j<7)
3: (i,j)→(i-1,j+2); (i>0,j<7)
4: (i,j)→(i-2,j+1); (i>1,j<8)
搜索策略:
S1:A[1]:=(0,0);
S2:从A[1]出发,按移动规则依次选定某个方向,如果达到的是(4,8)则转向S3,否则继续搜索下一个到达的顶点;
S3:打印路径。
【代码】
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> using namespace std; int a[10][10],t=0; int h[4]= {1,2,2,1}; //横坐标 int z[4]= {2,1,-1,-2}; //纵坐标 int search(int); int print(int); int main() { a[1][1]=a[1][2]=0; search(2); return 0; } int search(int i) { for(int j=0; j<4; j++) if(a[i-1][2]+h[j]>=0 && a[i-1][2]+h[j]<=8 && a[i-1][1]+z[j]>=0 && a[i-1][1]<=4) { a[i][1]=a[i-1][1]+z[j]; a[i][2]=a[i-1][2]+h[j]; if(a[i][1]==4 && a[i][2]==8) print(i); else search(i+1); } } int print(int e) { t++; cout<<t<<": "; for (int i=1; i<=e-1; i++) cout<<a[i][1]<<","<<a[i][2]<<"-->"; cout<<"4,8"<<endl; }