0

我试图打破几个嵌套的 while 循环,但我遇到了麻烦。我希望这个程序进入外循环,它只会运行一定的次数。我尝试用布尔值来做,但我的程序终止得太早了。这是一个 N-Queens 问题,我正在解决 1x1、2x2、3x3、...nxn 个皇后。

这是我的代码:

bool ok(int *q, int col)
{
   for(int i=0; i<col; i++)
      if(q[col]==q[i] || (col-i)==abs(q[col]-q[i])) return false;

return true;
};

void print(int q[], int n, int cnt)
{
    //static int count =0;
    cout<<"There are "<<cnt<<" solutions for "<<n<<" queens." <<endl;   
};

int main()
{
    int n;
    int *q;
    cout<<"Please enter the size of the board:"<<endl;
    cin>>n;

    int static count = 0;

    int c = 1;
    int a = 1;
    bool from_backtrack=false;

    while(a!=n){

        q= new int[a];
        q[0]=0;
        bool foundSolution=true;
        while(foundSolution)
        {
            if (c==a){
                a++;
            }
            while(c<a)
            {
                if(!from_backtrack)
                    q[c] = -1; //Start at the top
                from_backtrack=false;
                while(q[c]<a)
                {
                    q[c]++;
                    if  (q[c]==a)
                    {
                        c--;
                        if(c==-1) {
                            print(q, n, count);
                            foundSolution=false;
                            //system("PAUSE"); exit(1);
                        }
                        continue;
                    }
                    if( ok(q,c) ) break; //get out of the closest while loop
                }
                c++;
            }
            count++;
            c--;
            if(c==-1) {
                print(q, n, count);
                foundSolution=false;
                //system("PAUSE"); exit(1);
            }
            from_backtrack=true;
        }
        delete[a] q;
        a++;
    }
    system("PAUSE");
}
4

4 回答 4

2

最优雅的方法是将一些内部循环包装在一个函数中。它会更容易阅读和控制。

于 2013-03-13T23:06:54.103 回答
0

在我的工作中,我们采用 MISRA 指南,其中指出“......每个 while 循环只有 1 个中断”。这导致我重写了我的ifwhile循环:

bool can_continue = true;

if (can_continue)
{
  status = Do_Something();
  if (status != SUCCESS)
  {
    can_continue = false;
  }
}

if (can_continue)
{
  status = Do_Another_Thing();
  can_continue = status == SUCCESS;
}

//.. and so on.

这个想法是如果执行无法继续,则将标志设置为“false”。在任何段可能导致执行失败后检查它。

于 2013-03-13T23:34:25.443 回答
-1

认为它像无用一样疯狂。

但是,假设您想要 3 次迭代,您将定义一个由 3 个元素组成的 bool 数组(全部设置为 true)。在每次迭代中,将当前元素设置为 false,直到到达数组的末尾。

于 2013-03-14T01:40:51.247 回答
-1
while( true ){

    if( condition == true ){
        goto bye;
    }
}

:bye

只是不要在你的作业中提交这个......

于 2013-03-13T22:30:19.033 回答