- /*******************************************************
- * n 后求解问题
- *******************************************************/
- #include <iostream.h>
- #include <stdio.h>
- #include <math.h>
- #include <conio.h>
- #define MAXNUMBER 20 //最大求解数
- //输出n后的解
- /******************************************************
- * 例如8皇后的一组解为:
- * 1 5 8 6 3 7 2 4
- * 其含义为
- * 第1个皇后位于 第1行第 1 列
- * 第2个皇后位于 第2行第 5 列
- * 第3个皇后位于 第3行第 8 列
- * 第4个皇后位于 第4行第 6 列
- * ......
- * 第i个皇后位于 第i行第 x[i] 列 (i >= 1)
- ******************************************************/
- void output_queens(int x[],int n)
- {
- for(int i=1;i<=n;i++)
- printf("%3d",x[i]);
- printf("/n");
- }
- //判断第k个皇后是否合法
- bool check(int x[],int k)
- {
- for(int i=1;i<k;i++)
- {//列冲突x[i]==x[k] 或 斜线冲突abs(k-i)==abs(x[k]-x[i])
- if(x[i]==x[k] || abs(k-i)==abs(x[k]-x[i]))
- return false;
- }
- return true;
- }
- /*******************************************************
- * n后问题求解
- * input : n, the number of queens
- * output : the vector of solution, X
- *******************************************************/
- int n_queens(int n,int x[])
- {
- int nCount=0; //解的个数
- int k=1; //先处理第 1 个皇后
- x[1]=0;
- while(k>0)
- {
- x[k]=x[k]+1; //在当前列加1的位置搜索
- while(x[k]<=n && !check(x,k))
- x[k]=x[k]+1;//如果当前列x[k]不满足条件 则搜索下一列x[k]+1
- if(x[k]<=n)
- {//列x[k]满足条件
- if(k==n)
- {//当前是最后一个皇后 => 得到一组解
- //break; //若此处break 则只得到一组解
- nCount++;//解的个数加1
- output_queens(x,n); //输出n后的解
- }else
- {//计算第 k+1 个皇后
- k++;
- x[k]=0;
- }
- }else
- {//不存在满足条件的列 => 回溯
- x[k]=0;
- k--;
- }
- }
- return nCount;
- }
- void main()
- {
- int n=8;
- int x[MAXNUMBER]={0};
- printf("Game Start:/n");
- int nCount=n_queens(8,x);
- printf("TotalNumber:%4d/n",nCount);
- printf("Game over !!!/n/n/n");
- }