我们在学校收到了一个项目,该项目使用C ++编程算法,可以找到8 Queens问题的解决方案。我仍然认为自己是编程的新手,因此我可能没有使用最有效的工具。我使用了一个二维数组(8x8)来存储统计信息本身,并使用了另一个数组来存储一些统计信息,因此当到达无法继续使用的位置时,它只会删除正确的值。我的问题是,在编译时,有时确实会将某些变量从源数组更改为2。甚至当我删除所有与数组有关的等式时,我以前从未见过这样的事情。我总是输出两个数组,以检查其工作情况。谁能告诉我为什么这几个变量会发生变化?
PS:如果需要编译,可以通过按任意按钮将程序移至下一步。
我在GNU GCC编译器中使用Code :: Blocks 16.01。
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
int main()
{
int board[8][8], queens_placed=0, sources[8][8], line_progress[8];
//values: free:0, occupied:1, in-range:2;
//board[vertical][horizontal]
for (int i=0;i<8;i++) { //setting some values
for (int j=0;j<8;j++) {
board[i][j]=0;
sources[i][j]=9;
cout<<board[i][j]<<" ";
}
cout<<endl;
line_progress[i]=-1;
}
while (queens_placed!=8) {
bool full=true; //this detects if there are more possibilities
for (int i=0;i<8;i++) {
if (board[queens_placed][i]==0 && i>line_progress[queens_placed]) {
board[queens_placed][i]=1; //if there is free space then place the queen and allocate the relevant spaces
line_progress[queens_placed]=i;
sources[queens_placed][i]=8;
for (int j=queens_placed+1;j<8;j++) {
board[j][i]=2;
if (sources[j][i]==9) {sources[j][i]=queens_placed;}
}
for (int j=i+1;j<8;j++) {
board[queens_placed][j]=2;
if (sources[queens_placed][j]==9) {sources[queens_placed][j]=queens_placed;}
}
int alt1=queens_placed+1;
for (int j=i+1;j<8;j++) {
board[alt1][j]=2;
if (sources[alt1][j]==9) {sources[alt1][j]=queens_placed;}
alt1++;
}
int alt2=queens_placed+1;
for (int j=i-1;j>0;j--) {
board[alt2][j]=2;
if (sources[alt2][j]==9) {sources[alt2][j]=queens_placed;}
alt2++;
}
queens_placed++;
i=8;
full=false;
}
}
if (full==true) { //this is when we have to step back a little
line_progress[queens_placed]=-1;
queens_placed--;
for (int i=0;i<8;i++) {
if (board[queens_placed][i]==1) {
board[queens_placed][i]=0;
sources[queens_placed][i]=9;
}
}
for (int i=0;i<8;i++) {
for (int j=0;j<8;j++) {
if (sources[i][j]==queens_placed) {
sources[i][j]=9;
board[i][j]=0;
}
}
}
}
system("cls"); //the ckecking part
cout<<"Table status (-:empty spot, O:Queen's place, X:unavailable spot):"<<endl;
for (int i=7;i>=0;i--) {
for (int j=0;j<8;j++) {
if (board[i][j]==0) {cout<<"- ";}
if (board[i][j]==1) {cout<<"O ";}
if (board[i][j]==2) {cout<<"X ";}
}
cout<<endl;
}
cout<<endl<<"Sources:"<<endl;
for (int i=7;i>=0;i--) {
for (int j=0;j<8;j++) {
cout<<sources[i][j]<<" ";
}
cout<<endl;
}
int a=getch();
while (!a) {}
}
return 0;
}
答案 0 :(得分:0)
您的帖子中有很多代码,并且尚不清楚您希望解决的问题确切(有很多问题),但是您肯定遇到的一个错误是您重新越界:
int alt1=queens_placed+1;
for (int j=i+1;j<8;j++) {
board[alt1][j]=2;
if (sources[alt1][j]==9) {sources[alt1][j]=queens_placed;}
alt1++;
}
不变的是queens_placed != 8
,否则循环中断。您每循环增加一个,但是在某个时候我们将有queens_placed == 7
,这意味着alt1 == 7 + 1 == 8
,这意味着board[alt1][j]=2
越界(sources[alt1][j]
也是如此) 。 board[alt1][j]=2
很有可能正在您的sources
数组上爆炸。此外,您在做alt1++
时并没有检查它是什么...
一些证明,而不是单纯的猜测(将代码复制到test.cpp
中,并删除了Windows内容,并使用getch()
编译的g++ -g test.cpp -o test
调用,-g
允许调试) :
(lldb) n
Process 78941 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x0000000100001901 test`main at test.cpp:38
35 }
36 int alt1=queens_placed+1;
37 for (int j=i+1;j<8;j++) {
-> 38 board[alt1][j]=2;
39 if (sources[alt1][j]==9) {sources[alt1][j]=queens_placed;}
40 alt1++;
41 }
Target 0: (test) stopped.
(lldb) p alt1
(int) $18 = 8
建议(接受或保留):从您知道可以使用的较小的内容开始。很难推理程序中发生了什么(周围有很多变量,各处都引用了东西,局部性很小,圈复杂度极高,等等)。构建小功能(5-20行),并测试每个功能。清理电路板,检查电路板是一种解决方案,并且组成“下一个”电路板似乎具有良好的功能。然后编写功能以解决问题。
HTH。