T1219:马走日

【题目描述】

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

请编写一段程序,给定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 }
马走日
原文地址:https://www.cnblogs.com/zoom1109/p/11200830.html