馬走日的解法(dfs)

馬在中國象棋以日字形規則移動。ios

請編寫一段程序,給定n*m大小的棋盤,以及馬的初始位置(x,y),要求不能重複通過棋盤上的同一個點,計算馬能夠有多少途徑遍歷棋盤上的全部點。測試

Inputspa

第一行爲整數T(T < 10),表示測試數據組數。 code

每一組測試數據包含一行,爲四個整數,分別爲棋盤的大小以及初始位置座標n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)blog

Outputci

每組測試數據包含一行,爲一個整數,表示馬能遍歷棋盤的途徑總數,0爲沒法遍歷一次。Sample Inputio

1
5 4 0 0

Sample Outputclass

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;
} 
相關文章
相關標籤/搜索