马的遍历

【题目】

中国象棋半张棋盘如图4(a)所示。马自左下角往右上角跳。今规定只许往右跳,不许往左跳。比如图4(a)中所示为一种跳行路线,并将所经路线打印出来。打印格式为:0,0->2,1->3,3->1,4->3,5->2,7->4,8…
 

【算法分析】

       如图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:打印路径。

 【代码】

#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;
}
View Code

如果运气好也是错,那我倒愿意错上加错!

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6607560.html