在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。 Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。 Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input 1 8 5 0
Sample Output 1 92 10
题意:求出n*n里面放置棋子的情况,使得每个棋子所在行、列、对角线没有其它棋子
思路:
直接看代码吧,代码注释比较好懂。
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<cmath> 5 using namespace std; 6 7 int ans[11]; 8 int a[11]; 9 int sum,n; 10 11 int judge(int x) 12 { 13 for(int i=1; i<x; i++) //判断之前和走过的行是否有重复 14 { 15 int dd1=abs(i-x); 16 int dd2=abs(a[i]-a[x]); 17 if(a[i]==a[x]||(dd1==dd2)) 18 { 19 return 1; 20 } 21 } 22 return 0; 23 //对角线出现过即k=-1或1 24 //即斜率的绝对值=1 25 //即两者的横纵坐标对应相减后绝对值相等 26 } 27 void dfs(int x)//传入行 28 { 29 //cout<<x<<"&&&&&&&&&&&&"; 30 if(x>n) // if(x==n+1) 31 { 32 sum++; 33 return ; 34 } 35 36 for(int j=1; j<=n; j++) //决定下在哪一列 37 { 38 a[x]=j;//下上去 39 //cout<<judge(x)<<"*****"<<endl; 40 if(judge(x)==1)//说明出现过了 41 continue; 42 // return; 43 else 44 { 45 dfs(x+1); 46 } 47 } 48 return ; 49 } 50 51 int main() 52 { 53 std::ios::sync_with_stdio(false); 54 cin.tie(0); 55 cout.tie(0); 56 memset(ans,0,sizeof(ans)); 57 for(int i=1; i<=10; i++) 58 { 59 n=i; 60 sum=0; 61 dfs(1); 62 ans[i]=sum; 63 } 64 while(cin>>n) 65 { 66 if(n==0) 67 break; 68 cout<<ans[n]<<endl; 69 } 70 return 0; 71 }