代码改变世界

回溯法-------n皇后问题

2011-09-27 11:49  ...平..淡...  阅读(317)  评论(1编辑  收藏  举报
n皇后问题
 1 /*
2 n皇后问题
3 k表示行号,x[k]表示列号
4 */
5 #include <iostream>
6 #include <cmath>
7 using namespace std;
8 int x[100];
9
10 bool place(int k) //判断此位置是否可以放皇后
11 {
12 int i=0;
13 while(i<k)
14 {
15 if( (x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k) ) )
16 {
17 return false;
18 }
19 i++;
20 }
21 return true;
22 }
23
24 void nQueens(int n)
25 {
26 int k=0;
27 x[k]=0;
28 while(k>=0)
29 {
30 x[k]=x[k]+1; //皇后后移一列
31 while( (x[k]<=n) && (place(k)==false) ) //确定第k行皇后的列数x[k]
32 x[k]=x[k]+1;
33 if(x[k]<=n) //若列号等于最后一列
34 {
35 if(k==n-1) //所有皇后位置已经全部确定
36 {
37 for(int i=0;i<n;i++)
38 cout<<x[i]<<" ";
39 cout<<endl;
40 }
41 else //否则,考虑下一个皇后
42 {
43 k++;
44 x[k]=0; //初始化下一行的皇后的列号为0
45 }
46 }
47 else
48 k--; //当前行皇后无位置换,则将上一行皇后的位置重新摆放
49 }
50 }
51
52 int main()
53 {
54 int n;
55 cout<<"输入皇后个数n:"<<endl;
56 cin>>n;
57 cout<<"输出结果:"<<endl;
58 nQueens(n);
59 return 0;
60 }