粥粥528 2022-12-23 11:10 采纳率: 84%
浏览 21

为啥都输出啦?按理只输出两个呀

n皇后非递归求解

#include <iostream>
#include<cmath>
using namespace std;
#define N 4
int x[N];
int Place(int k)
{
    for(int i=0;i<k;i++)
    {
       if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k])) //约束条件不在同一行(那是必然)不在同一列也不再同对角线上
        return 1;
       else
        return 0;
    }
}
void queen()
{
    for(int i=0;i<N;i++)
    {
        x[i]=-1;
    }
    int k=0,count=0;
    while(k>=0)
    {
        x[k]=x[k]+1;//第一个皇后放了哈,就先给你放在第一个
        while(x[k]<N && Place(k)==1)
        {
            x[k]=x[k]+1;
        }//看看违反约束条件没
        if(x[k]<N)
        {
            if(k==N-1)
            {
                cout<<"plan "<<++count<<endl;//到了最后一个皇后了,可以出第一个方案啦
                for(int i=0;i<N;i++)
                {
                  cout<<x[i]+1<<" ";
                }
                  cout<<endl;
            }
            else//皇后们别急一个个来
            k=k+1;
        }

        else//倒霉的皇后没找到位置,跟上一个皇后商量一下
        {
            x[k]=-1;
            k=k-1;
        }
    }
}
int main()
{
   queen();
   return 0;
}


  • 写回答

2条回答 默认 最新

  • 於黾 2022-12-23 11:34
    关注

    你要搞n皇后就必然要递归,否则每一个分支你没地方保存啊
    要不然你就要自己想办法让皇后能够遍历整个二维数组
    //倒霉的皇后没找到位置,跟上一个皇后商量一下
    这里出问题了,皇后没找到位置,那么整个分支都要减掉,而不能仅仅退回上一步
    比如1,2,3,4,5,6的位置已经决定了不可能有解,但是无论如何7都能放下去,到了8就没地方放了
    你老是退回到7,来回改7的位置有什么用呢

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 12月23日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境