【题目描述】
马在中国象棋以日字形规则移动。
请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
【输入】
第一行为整数T(T < 10),表示测试数据组数。
每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。
【输出】
每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。
【输入样例】
1 5 4 0 0
【输出样例】
32
解题思路
八个方向;
代码如下
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N = 20; 5 int row, col,sx, sy, cnt = 0; 6 int vis[N][N]; 7 int dir[8][2] = {{1, 2}, {-1, 2}, {1, -2}, {-1, -2}, {2, 1}, {2, -1}, {-2, 1}, {-2, -1}}; 8 void dfs(int x, int y, int s){ 9 if(s == row * col){ 10 cnt++; 11 return; 12 } 13 for(int i = 0; i < 8; i++){ 14 int tx = dir[i][0] + x, ty = dir[i][1] + y; 15 if(tx < 0 || tx > row - 1 || ty < 0 || ty > col - 1) continue; 16 if(!vis[tx][ty]){ 17 vis[tx][ty] = 1; 18 dfs(tx, ty, s + 1); 19 vis[tx][ty] = 0; 20 } 21 } 22 } 23 int main(){ 24 int num; 25 cin >> num; 26 while(num--){ 27 cin >> row >> col >> sx >> sy; 28 memset(vis, 0, sizeof(vis)); 29 cnt = 0; 30 vis[sx][sy] = 1; 31 dfs(sx, sy, 1); 32 33 cout << cnt << endl; 34 } 35 36 return 0; 37 }