马走日-dfs

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

请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。


  • 马能走的方向不是4个(上下左右),而是8个。
  • 有多组数据!!!
  • x,y下标均从0开始

#include<bits/stdc++.h>
using namespace std;

bool vis[15][15];
int ans=0;
int h,l;

int dx[]= {-1,-2,-2,-1,1,2,2,1};
int dy[]= {-2,-1,1,2,2,1,-1,-2};

void dfs(int x,int y,int dep) {
    if(dep==h*l) {
        ans++;
        return;
    }
    for(int i=0; i<8; i++) {
        int x2=x+dx[i];
        int y2=y+dy[i];
        if(x2<0 || x2>h-1 || y2<0 || y2>l-1) continue;
        if(vis[x2][y2]) continue;
        vis[x2][y2]=1;
        dfs(x2,y2,dep+1);
        vis[x2][y2]=0;
    }
}

int main () {
    int T;
    cin>>T;
    while(T--) {
        int x,y;
        cin>>h>>l>>x>>y;

        memset(vis,0,sizeof vis);
        ans=0;

        vis[x][y]=1;
        dfs(x,y,1);
        cout<<ans<<endl;
    }
    return 0;
}

 

posted on 2024-02-06 21:08  可爱楷玩算法  阅读(60)  评论(0)    收藏  举报

导航