馬走日的解法(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;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM