著名的皇后问题大家应该都看过,皇后不能在同一行同一列同一斜线上,否则会互相攻击。这题原来没有打表是超时。
代码:
#include<iostream> using namespace std; int n,c[15],cnt,ans[15]; void DFS(int cur) { if( cur==n){ cnt++; return ; } else{ for(int i=0; i<n; i++){ c[cur]=i; bool flag=true; for(int j=0; j<cur; j++){ if( c[j]==i|| c[j]-j==i-cur|| c[j]+j==cur+i){ flag=false; break; } } if( flag) DFS(cur+1); } } } int main() { int i; for( i=1; i<11; i++){ memset(c,0,sizeof(c)); cnt=0; n=i; DFS(0); ans[i]=cnt; } while( scanf("%d",&n)&&n){ printf("%d\n",ans[n]); } }还有一种投机取巧的办法,就是先运行1到10,把结果存起来,不过时间居然一样,奇葩!这个仅供娱乐啊,因为n小,本来以为可以省时间
代码:
#include<iostream> using namespace std; int a[11]={0,1,0,0,2,10,4,40,92,352,724}; int main() { int n; while( scanf("%d",&n)&&n){ printf("%d\n",a[n]); } return 0; }