为什么我的变量无处不在?

时间:2018-11-27 20:38:56

标签: c++

我们在学校收到了一个项目,该项目使用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;
}

1 个答案:

答案 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。