2011-07-14 131 views
0

作业是完成8皇后2维阵列程序与回溯。我做了这个程序是否正确?

#include <iostream> 

using namespace std; 

int main() { 
    int b[8][8] = { 0 }; 
    int r, c, i; 
    int count = 1; 
    b[0][0] = 1; 
    c = 0; 

nextColumn: 
    c++; 
    if (c == 8) 
     goto print; 
    r =- 1; 

nextRow: 
    r++; 
    if (r == 8) 
     goto back; 
    for (i = 0; i < c; i++) { 
     if (b[r][i] == 1) 
      goto nextRow; 
    } 
    for (i = 0; (r - i) >= 0 && (c - i) >= 0; i++) { 
     if (b[r - i][c - i] == 1) 
      goto nextRow; 
    } 
    for (i = 0; (r + i) < 8 && (c - i) >= 0; i++) { 
     if (b[r + i][c - i] == 1) 
      goto nextRow; 
    } 
    b[r][c] = 1; 
    goto nextColumn; 
    c--; 
    if (c == -1) 
     return 0; 
    r = 0; 
    while (b[r][c] != 1) 
     r++; 
    b[r][c] = 0; 
    goto nextRow; 
    cout << endl; 
    cout << "Result No." << count << endl; 
    cout << endl; 
    for (r = 0; r < 8; r++){ 
     for (int c = 0; c < 8; c++){ 
      cout << b [r][c]; 
     } 
     cout << endl; 
    } 
    count++; 
    goto back; 
} 
+1

那么,“它产生正确的解决方案”和“使用回溯”? (我猜测代码中有些东西是“错误的”。) – 2011-07-14 03:40:13

+2

* gasp *,看看所有那些goto的马! – greatwolf

回答

6

那么,没有。

  • 一切都是一大功能;它应该被分解为很小的功能
  • 程序 - 像所有的程序 - 应该是自我测试。应该有一个函数返回true如果程序工作,并且false如果没有。
  • 您正在使用单字符变量名称;变量应该有有意义的名字。
  • 你正在写每一个级别的cout;您应该执行计算,返回结果,然后(可选)将结果打印到cout。
  • 您正在使用goto,这通常被认为是有害的。而你正在使用它很多,这总是被认为是有害的。
+0

虽然这会使程序在行为上“不正确”吗? –

+0

甚至没有格式化(什么格式?)的评论,我很佩服你的约束;-) – 2011-07-14 03:39:55

+6

@Delan Azabani - “除此之外,[林肯夫人](http://en.wikipedia.org/wiki/Assassination_of_Abraham_Lincoln),你是怎么喜欢这部戏的?目前程序是否产生正确的答案很少有关系。在学术界(这是我认为OP的地方),它不会让他获得好成绩;在专业领域,你不能*告诉*如果代码是一团糟,如果它得到了正确的答案,并且即使它确实如此,这些要求将不可避免地随着时间的推移而改变,而写得很差的程序将很快破裂。 – Malvolio

3

如果您关心您的程序是否正确,请确保它是首先可读的。

因此正确缩进程序,声明(和init)变量在哪里使用它们,并停止使用goto语句。如果您想从for循环中提前退出,则有break。 (或者更好的方法是,将循环代码写入一个单独的函数中并使用早期返回!)。

相关问题