【 问题描述】
在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘。
输出前5个方案及总方案数。
【输出格式示例】
1 16 21 10 25
20 11 24 15 22
17 2 19 6 9
12 7 4 23 14
3 18 13 8 5
【代码】
#include<iostream> #include<cstdio> using namespace std; int a[100][100]= {0},t=0; //数组记每一步走在棋盘的哪一格,t记录最终方案个数 bool b[100][100]= {0}; //棋盘的每一格有没有被走过 int h[8]= {1,2,2,1,-1,-2,-2,-1};//横坐标 int z[8]= {2,1,-1,-2,2,1,-1,-2};//纵坐标 int search(int,int,int);//在每一格中试遍所有的方案 int print();//输出方案 int main() { a[1][1]=1; //从一开始 b[1][1]=1; //已经走过 search(1,1,2); cout<<t<<endl; //最终有几种方案 return 0; } int search(int i,int j,int n) { int x,y,q; //x为横,y为纵 if(n>25) { print(); return 0; } for(q=0; q<=7; q++) { //8次都试一遍 //u横,v纵 x=i+h[q]; y=j+z[q]; if((!b[x][y]) && x>=1 && x<=5 && y>=1 && y<=5) { b[x][y]=1; //已经使用 a[x][y]=n; search(x,y,n+1); b[x][y]=0; //回溯 a[x][y]=0; } } } int print() { t++; if(t<=5) { for(int p=1; p<=5; p++) { for(int q=1; q<=5; q++) printf("%5d",a[p][q]); cout<<endl; } cout<<"-------------------------------"<<endl; } else if(t>5) return 0; }