2011-07-14 107 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。 (或者更好的方法是,將循環代碼寫入一個單獨的函數中並使用早期返回!)。

相關問題