7-17 跳马问题
马在中国象棋以日字形规则移动。
请编写一段程序,给定m×n大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
输入格式:
输入四个整数,分别为棋盘的大小以及初始位置坐标m,n,x,y。(0≤x≤m-1,0≤y≤n-1, m <=10, n <=10)。
输出格式:
一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。
输入样例:
5 4 1 0
输出样例:
7
#include <iostream>
using namespace std;
int m,n,x,y,cnt;
int b[12][12];
int dx[8]={-2,-2,-1, 1, 2, 2, 1,-1};
int dy[8]={ 1,-1,-2,-2,-1, 1, 2, 2};
void f(int aa,int bb,int t){
int xx,yy,p,q;
if(t>m*n)
{
/*for(p=0;p<=m-1;p++)
{
for(q=0;q<=n-1;q++)
{
print("%3d",b[p][q]);
}
cout<<endl;
}*/
cnt++;
//cout<<endl;
//return ;
}
for(int i=0;i<=7;i++)
{
xx=aa+dx[i];
yy=bb+dy[i];
if(xx>=0&&xx<=m-1&&yy>=0&&yy<=n-1&&b[xx][yy]==0)
{
b[xx][yy]=t;
f(xx,yy,t+1);
b[xx][yy]=0;
}
}
}
int main(){
cin>>m>>n>>x>>y;
b[x][y]=1;
f(x,y,2);
cout<<cnt;
return 0;
}