1 8 5 0
1 92 10
常规解法:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int n,tmp; int map[11]; void DFS(int k) { int i,j,flag; if(k==n+1) { tmp++; return; } else { for(i=1;i<=n;++i) { map[k]=i; flag=1; for(j=1;j<k;++j) { if(map[j]==i||i-k==map[j]-j||i+k==map[j]+j) //回溯 { flag=0; break; } } if(flag) DFS(k+1); } } } int main() { int i,m; int ans[11]; for(n=1;n<=10;++n) { tmp=0; DFS(1); ans[n]=tmp; } while(scanf("%d",&m),m) { printf("%d\n",ans[m]); } return 0; }
different:bool表,周大神的超精简解法,看到后惊呆了~~~
#include <iostream> #include <cstring> #define N 12 using namespace std; int n; int COUNT; bool L[N]; bool zq[2*N]; bool yq[2*N]; int getzq(int r,int c) { return n+r-c; } int getyq(int r,int c) { return r+c; } void dfs(int index=0) { if(index==n) { COUNT++; } for(int i=0;i<n;i++) { if(L[i]||zq[ getzq(index,i) ]||yq[ getyq(index,i) ])continue; L[i]=zq[ getzq(index,i) ]=yq[ getyq(index,i) ]=true; dfs(index+1); L[i]=zq[ getzq(index,i) ]=yq[ getyq(index,i) ]=false; } } int main() { int s[11]; int i=1; while(i!=11) { n=i; memset(L,0,sizeof(L)); memset(zq,0,sizeof(zq)); memset(yq,0,sizeof(yq)); COUNT=0; dfs(); s[i]=COUNT; i++; } while(cin>>n) { if(n==0)break; cout<<s[n]<<endl; } return 0; }