马走日

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

请编写一段程序,给定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 int route;//路数 
 5 int step = 1;//步数 
 6 int book[11][11] = {0};//标记 
 7 int n, m;
 8 void dfs(int x, int y){
 9     //以下是马走的8个方向 
10     int next[8][2]={-1,2,
11                     1,2,
12                     2,1,
13                   2,-1,
14                    1,-2,
15                    -1,-2,
16                    -2,-1,
17                     -2,1
18                         };
19         
20     if(step == m * n){//马走完棋盘上所有的点 
21         route++;//路径加1 
22         return;
23     }
24         for(int k = 0; k < 8; k++){
25             int tx = x + next[k][0];
26             int ty = y + next[k][1];
27             
28             if(tx < 0 || tx >= n||ty < 0 || ty >= m){//越界 
29                         
30                 continue;
31             }
32 
33             if(book[tx][ty] == 0){//tx,ty点没走过 
34                 book[tx][ty] = 1;//标记为走过 
35                 step++;//步数加1 
36                 dfs(tx,ty);//继续向下走 
37                 step--;//步数减1 
38                 book[tx][ty] = 0;//取消标记 
39             }
40         }
41 }
42 int main(){
43     int t;
44     cin >> t;
45     while(t--){
46    route=0;
47         int startx,starty;
48         cin >> n >> m >> startx >> starty;
49         book[startx][starty] = 1;
50         dfs(startx,starty);
51         cout << route << endl;
52     }
53 
54     return 0;
55 } 

 

posted @ 2019-03-19 22:19  kakaluotedj  阅读(217)  评论(0)    收藏  举报