马的遍历

在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;
}
posted @ 2023-03-18 09:58  Momo·Trace  阅读(50)  评论(0编辑  收藏  举报