- /*******************************************************
- *n后求解问题
- *******************************************************/
- #include<iostream.h>
- #include<stdio.h>
- #include<math.h>
- #include<conio.h>
- #defineMAXNUMBER20//最大求解数
- //输出n后的解
- /******************************************************
- *例如8皇后的一组解为:
- *15863724
- *其含义为
- *第1个皇后位于第1行第1列
- *第2个皇后位于第2行第5列
- *第3个皇后位于第3行第8列
- *第4个皇后位于第4行第6列
- *......
- *第i个皇后位于第i行第x[i]列(i>=1)
- ******************************************************/
- voidoutput_queens(intx[],intn)
- {
- for(inti=1;i<=n;i++)
- printf("%3d",x[i]);
- printf("\n");
- }
- //判断第k个皇后是否合法
- boolcheck(intx[],intk)
- {
- for(inti=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]))
- returnfalse;
- }
- returntrue;
- }
- /*******************************************************
- *n后问题求解
- *input:n,thenumberofqueens
- *output:thevectorofsolution,X
- *******************************************************/
- intn_queens(intn,intx[])
- {
- intnCount=0;//解的个数
- intk=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--;
- }
- }
- returnnCount;
- }
- voidmain()
- {
- intn=8;
- intx[MAXNUMBER]={0};
- printf("GameStart:\n");
- intnCount=n_queens(8,x);
- printf("TotalNumber:%4d\n",nCount);
- printf("Gameover!!!\n\n\n");
- }
N 皇后求解回溯算法
最新推荐文章于 2019-10-07 09:54:45 发布