#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
int u[8]={1,2,2,1,-1,-2,-2,-1}, //8个方向上的x,y增量
v[8]={-2,-1,1,2,2,1,-1,-2};
int a[100][100]={0},num=0; //记每一步走在棋盘的哪一格和棋盘的每一格有
//没有被走过
bool b[100][100]={0};
int search(int,int,int); //以每一格为阶段,在每一阶段中试遍8个方向
int main()
{
a[1][1]=1;b[1][1]=1; //从(1,1)第一步开始走
search(1,1,2); //从(1,1)开始搜第2步该怎样走
cout<<num<<endl; //输出总方案(304)
return 0;
}
int search(int i,int j,int n)
{
int k,x,y; //这三个变量一定要定义局部变量
if (n>25) {num++; return 0;} //达到最大规模打印、统计方案
for (k=0;k<=7;k=k+1) //试遍8个方向
{
x=i+u[k];y=j+v[k]; //走此方向,得到的新坐标
if (x<=5&&x>=1&&y<=5&&y>=1&&(!b[x][y]))
{ //如果新坐标在棋盘上,并且这一格可以走
b[x][y]=1;
a[x][y]=n;
search(x,y,n+1); //从(x,y)去搜下一步该如何走
b[x][y]=0;
a[x][y]=0;
}
}
return 0;
}
/**************************************************************
Problem: 2115
User: admin
Language: C++
Result: Accepted
Time:43 ms
Memory:2120 kb
****************************************************************/