马的遍历

在n*m(n表示行,m表示列)的棋盘上,马起始位置为x,y(注意:左上角第一个位置为1,1),问:马有多少种走的方法,将棋盘所有的位置全部走一遍,并且每个位置经过且仅经过一次。马跳“日”字。

输入

           第一行:n,m(中间空格隔开)(n,m<7)

   第二行:x,y(中间空格隔开)

输出

   可能的方法数

样例

样例输入1

5 4

1 1

样例输出1 

32

code:

#include <bits/stdc++.h>
using namespace std;
int ans = 0,n,m,arr[7][7];
int xx[9] = {0,-2,-2,-1,1,2,2,-1,1};
int yy[9] = {0,-1,1,2,2,-1,1,-2,-2};
void q(int a,int b,int k){
    if(k == n*m){
        ++ans;
        return; 
    }
    for(int i = 1;i<=8;i++){
        int abx = a+xx[i];
        int aby = b+yy[i];
        if(!arr[abx][aby] && abx > 0 && aby > 0 && abx <= n && aby <= m){
            arr[abx][aby] = 1;
            q(abx,aby,k+1);
            arr[abx][aby] = 0;
        }
    }
    
}
int main(){
    int x,y;
    cin>>n>>m;
    cin>>x>>y;
    arr[x][y] = 1;
    q(x,y,1);
    cout<<ans;
    return 0;
}

 

posted @ 2023-03-18 09:40  nasia  阅读(99)  评论(0)    收藏  举报