中国象棋跳马
这道题呢需要方向数组跟别的差不多所以我就只写注意事项:
dfs函数ans++的条件是k==n*m不是像其他题一样k>n*m.
主函数中初始点的vis要等于1.
vis需要初始化.
程序:
#include<bits/stdc++.h> using namespace std; int ans=0,n,m,vis[19][19]={0},d[10][10]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}}; void dfs(int k,int x,int y) { if(k==n*m) { ans++; } else { for(int i=0;i<8;++i) { int nx=x+d[i][0],ny=y+d[i][1]; if(vis[nx][ny]==0&&nx<n&&ny<m&&nx>=0&&ny>=0) { vis[nx][ny]=1; dfs(k+1,nx,ny); vis[nx][ny]=0; } } } } int main() { int t1; cin>>t1; for(int i=1;i<=t1;i++) { int x1,y1; memset(vis,0,sizeof(vis)); cin>>n>>m>>x1>>y1; vis[x1][y1]=1; dfs(1,x1,y1); cout<<ans<<endl; ans=0; } return 0; }