马走日的解法(dfs)

Posted qdu-lkc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了马走日的解法(dfs)相关的知识,希望对你有一定的参考价值。

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

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

Input

第一行为整数T(T < 10),表示测试数据组数。 

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)

Output

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。Sample Input

1
5 4 0 0

Sample Output

32

马走日,4个方向换成8个方向深搜

代码:
#include<iostream>
using namespace std;
int n,m,x,y;
int cnt;
int vis[10][10];
int dx[]={2,-2,1,-1,2,-2,1,-1};
int dy[]={1,1,2,2,-1,-1,-2,-2};
void dfs(int x,int y,int t){
     if(t==n*m-1){
         cnt++;
         return;
     }
     for(int i=0;i<8;i++){
         int xx=x+dx[i];
         int yy=y+dy[i];
         if(xx<0||yy<0||xx>=n||yy>=m) continue;
         if(vis[xx][yy]) continue;
         vis[xx][yy]=true;
         dfs(xx,yy,t+1);
         vis[xx][yy]=false;
     }
}

int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n>>m>>x>>y;
        for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
             vis[i][j]=false;
        cnt=0;
        vis[x][y]=true;
        dfs(x,y,0);
        cout<<cnt<<endl;
    }    
    return 0;
} 

 

以上是关于马走日的解法(dfs)的主要内容,如果未能解决你的问题,请参考以下文章

[dfs] aw1116. 马走日(dfs搜索顺序+模板题)

马走日 (DFS)

BZOJ1085: [SCOI2005]骑士精神

马走日问题(Java版)

骑士巡游的问题简述如下:在国际象棋盘上某一位置放置一个马的棋子,然后采用象棋中“马走日字”规则

马走日