马走日(深搜)

马在中国象棋以日字形规则移动。

请编写一段程序,给定 n∗m
大小的棋盘,以及马的初始位置 (x,y)

,要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
输入格式

第一行为整数 T

,表示测试数据组数。

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标 n,m,x,y


输出格式

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,若无法遍历棋盘上的所有点则输出 0。
数据范围

1≤T≤9
,
1≤m,n≤9,
0≤x≤n−1,
0≤y≤m−1

输入样例:

1
5 4 0 0

输出样例:

32

#include
#include
#include
#include
using namespace std;
bool sen[11][11];
int m, n;
int ans;
int dx[8] = { 1,-1,2,-2,1,-1,2,-2 }, dy[8] = { 2,-2,1,-1,-2,2,-1,1 };
void dfs(int a, int b, int c)
{
	if (c == m * n)
	{
		ans++;
		return;
	}
	for (int i = 0; i < 8; i++)
	{
		int aa = a + dx[i], bb = b + dy[i];
		if (aa < 0 || aa >= n || bb < 0 || bb >= m)
			continue;
		if (!sen[aa][bb])continue;
		sen[a][b] = false;
		dfs(aa, bb, c + 1);
		sen[a][b] = true;
	}

}
int main()
{
	int t; cin >> t;
	while (t--)
	{
		memset(sen, true, sizeof(sen));
		ans = 0;
		int x, y;
		cin >> n >> m >> x >> y;
		dfs(x, y, 1);
		cout << ans << endl;

	}
}

你可能感兴趣的:(基础算法)