n皇后有关问题 求查错
n皇后问题 求查错!
该段代码 只能 在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; 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(); }