马在中国象棋以日字形规则移动。
请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
1 5 4 0 0
32
1 #include <bits/stdc++.h> 2 using namespace std; 3 int visit[20][20]; 4 int ans,sum; 5 int t,x,y,n,m; 6 int dr[8]={-1,-2,-2,-1,1,2,2,1}; 7 int dc[8]={-2,-1,1,2,2,1,-1,-2}; 8 void dfs(int i,int j){ 9 if(sum==m*n){ 10 ans++; 11 return; 12 } 13 else{ 14 for(int k=0;k<8;k++){ 15 int rr=i+dr[k]; 16 int cc=j+dc[k]; 17 if(visit[rr][cc]==0&&rr>=0&&cc>=0&&rr<n&&cc<m){ 18 visit[rr][cc]=1; 19 sum++; 20 dfs(rr,cc); 21 sum--; 22 visit[rr][cc]=0; 23 } 24 } 25 26 } 27 } 28 29 int main() { 30 31 cin>>t; 32 while(t--) { 33 ans=0; 34 sum=1; 35 cin>>n>>m>>x>>y; 36 memset(visit,0,sizeof(visit)); 37 visit[x][y]=1; 38 dfs(x,y); 39 cout<<ans<<endl; 40 } 41 42 return 0; 43 }
原文:https://www.cnblogs.com/aiqinger/p/12621290.html