马的遍历
在n*m(n表示行,m表示列)的棋盘上,马起始位置为x,y(注意:左上角第一个位置为1,1),问:马有多少种走的方法,将棋盘所有的位置全部走一遍,并且每个位置经过且仅经过一次。马跳“日”字。
输入
第一行:n,m(中间空格隔开)(n,m<7)
第二行:x,y(中间空格隔开)
输出
可能的方法数
样例输入
5 4
1 1
样例输出
32
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[10][10];
int fx[9]={0,-2,-2,-1,1,2,2,1,-1},fy[9]={0,-1,1,2,2,1,-1,-2,-2};
void dfs(int x,int y,int k)
{
if(k==n*m)
{
ans++;
return;
}
for(int i=1;i<=8;i++)
{
int xx=x+fx[i];
int yy=y+fy[i];
if(!a[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=m)
{
a[xx][yy]=1;
dfs(xx,yy,k+1);
a[xx][yy]=0;
}
}
}
int main()
{
cin >> n >> m;
int aa,bb;
cin >> aa >> bb;
a[aa][bb]=1;
dfs(aa,bb,1);
cout << ans;
return 0;
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/madebianli.html