读书人

n皇后有关问题 求查错

发布时间: 2012-06-03 16:59:40 作者: rapoo

n皇后问题 求查错!

C/C++ code
#include <iostream>#include <stdio.h>#include <stdlib.h> #include <queue>#include <cmath>using namespace std;bool CanPos(int *pos, int level, int i){    for (int j = 0; j < level; j++)    {        if (abs(pos[j] - i) == abs(j - level) || (pos[j] == i))        {//处在同一斜行或者同一列的,排除              return false;        }    }    return true;}int * GetNQueensPos(int n){    int *pos = new int[n];//数组 pos[j]表示第j行的第几列,从0开始。     int level = 0;    queue<int *> *QPos = new queue<int *>();//列的队     queue<int> *QLevel = new queue<int>();//行的队     while (true)    {        if (level == n)            {            break;        }        for (int i = 1; i <= n; i++)        {            if (CanPos(pos, level, i))//满足条件             {                pos[level] = i;//第i列的位置记下来                 QPos->push(pos);                 QLevel->push(level + 1);//符号条件的位置入队。                 break;            }        }        pos = QPos->front();        QPos->pop();        level = QLevel->front();        QLevel->pop();        //出队。     }    return pos;}int main(){        int n;        cout << "请输入皇后的个数:" << endl;         scanf ("%d", &n);        int *pos = GetNQueensPos(n);        cout << "放置方案:"<< endl;         for (int i = 0; i < n; i++)        {            cout << pos[i] << " ";        }        cout << endl;         system("pause");        return 0;   }

该段代码 只能 在5的时候

正确运行

n!=5 的时候都出现错误


求解答。

[解决办法]
我对楼主这程序表示强烈的怀疑。你用队列存储数组的地址??还push,pop的,有什么意思呢?这个地址又不会变。先mark下。等下回来仔细看。
[解决办法]
我上面的程序已经给你改了,另外这里队列没什么用可以直接删掉,
这是没有队列的
C/C++ code
#include <iostream>#include <stdio.h>#include <stdlib.h> #include <queue>#include <cmath>using namespace std;bool CanPos(int *pos, int level, int i){    for (int j = 0; j < level; j++)    {        if (abs(pos[j] - i) == abs(j - level) || (pos[j] == i))        {//处在同一斜行或者同一列的,排除              return false;        }    }    return true;}int * GetNQueensPos(int n){    int *pos = new int[n];//数组 pos[j]表示第j行的第几列,从0开始。     int level = 0;    int i=1;    while (true)    {        if (level == n || level <0)            {            break;        }        for (; i <= n; i++)        {            if (CanPos(pos, level, i))//满足条件             {                pos[level++] = i;//第i列的位置记下来                 break;            }        }        if(i>n)        {            level--;            i=pos[level]+1;            continue;        }        i=1;     //出队。     }    return pos;}int main(){        int n;        cout << "请输入皇后的个数:" << endl;         scanf ("%d", &n);        int *pos = GetNQueensPos(n);        cout << "放置方案:"<< endl;         for (int i = 0; i < n; i++)        {            cout << pos[i] << " ";        }        cout << endl;         system("pause");        return 0;   }
[解决办法]
C/C++ code
#include "iostream"using namespace std; //N皇后#define N 8 //que[k]表示第k行的皇后放置的列int que[N]; //检测第k行的皇后位置摆放是否正确//不能和前k-1行的皇后在同一列,也不能在一条斜线上bool canPlace(int k){    for (int i=0; i<k; i++)    {        if ((que[i] == que[k]) || (abs(que[i] - que[k]) == k-i) )            return false;    }     return true;}  void Print(){    for (int i=0; i<N; i++)    {        for (int k = 0; k<N; k++)        {            if (que[i] == k)                cout<<"Q";            else                cout<<"B";        }        cout<<endl;    }     cout<<"-------------------------------------"<<endl;} //N皇后回溯void queen(int k){    //N个皇后摆放完毕,输出结果    if (k == N)        Print();     else    {        for (int j=0; j<N; j++)        {            //将第k行的皇后放在第j列            que[k] = j;             if (canPlace(k))                queen(k+1);        }    }} int main(int argc, char *argv[]){    queen(0);     getchar();} 

读书人网 >C++

热点推荐