题目描述
【例5.8】跳马问题。在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求其跳遍整个棋盘。输出跳遍整个棋盘的不同方案总数。
例如其中的一种跳法为:
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
不同的方案数应为:304
代码如下:
#include<iostream>
using namespace std;
bool a[5][5] = { 0 };
int x[8] = { 1,1,-1,-1,2,2,-2,-2 };
int y[8] = { 2,-2,2,-2,1,-1,1,-1 };
int num = 0;//方案数
int way = 0;//已访问结点数
void search(int i, int j)
{
if (!a[i][j])
{
a[i][j] = 1;
way++;
if (way == 25)
num++;
else
{
for (int m = 0;m < 8;m++)//下一个点
{
if (i + x[m] >= 0 && i + x[m] <= 4 && j + y[m] >= 0 && j + y[m] <= 4 && !a[i+x[m]][j+y[m]])
search(i + x[m], j + y[m]);
}
}
a[i][j] = 0;
way--;
}
}
int main()
{
search(0,0);//从坐标(0,0)开始
cout << num << endl;
}