馬在中國象棋以日字形規則移動。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; }