2014-10-06 418 views
0

如何製作可變大小的棋盤格?我可以使用此代碼由單個字符的棋盤:如何在C++中使用可變大小的棋盤來創建棋盤格?

#include <iostream> 
using namespace std; 

int main() 
{ 
    char C; 
    int length; 
    int width; 
    int count = 0; 
    int N; 
    int row = 0; 
    int col = 0; 

    cout << "Input C" << endl; 
    cin >> C; 
    cout << "Input length" << endl; 
    cin >> length; 
    cout << "Input width" << endl; 
    cin >> width; 
    cout << "Input N" << endl; 
    cin >> N; 

    for (row = 0; row < N; ++row) { 
     if (row % 2 == 1) { 
      for (count = 0; count < length; count++) { 
       { 
        cout << "-"; 
       } 
       cout << ""; 
      } 
     } 
     for (col = 0; col < N; ++col) { 
      for (count = 0; count < length; count++) { 
       { 
        cout << C; 
       } 
       cout << ""; 
      } 
      if (col != N) { 
       for (count = 0; count < length; count++) { 
        { 
         cout << "-"; 
        } 
        cout << ""; 
       } 
      } 
     } 
     cout << endl; 
    } 
    printf("\n"); 
} 

但它只是讓我的單字符的輸出,我怎麼會加入不同的「塊」大小代入公式?

對於examaple,給出一個字符(C),一長度(L),寬度(W),和一個大小(N),寫一個C++程序繪製尺寸的板(2N X 2N)由填充字符C,長度L和寬度W的單元組成。板單元必須像國際象棋棋盤一樣塗漆

假設C ='&',L = 4,W = 6,並且N = 3

輸出將是這個(沒有邊界線)

http://i.stack.imgur.com/qQk2J.png

回答

0

老實說,我試圖通過你的代碼來查看錯誤,但我最終從頭開始重寫了這個問題。這些都是關於嵌套循環的,你需要其中的一些來進行細粒度的控制。

該訣竅,我的代碼(我希望評論是有幫助的):

#include <iostream> 

int main(){ 
    // Our variables 
    char C; 
    int L, W, N; 
    // Take parameters from standard input 
    std::cin >> C >> L >> W >> N; 

    // Loop over all coarse rows 
    for(int row = 0; row < 2*N; row++){ 
     // Loop over the fine rows 
     for(int smallrow = 0; smallrow < L; smallrow++){ 
      // Loop over the coarse columns 
      for(int col = 0; col < 2*N; col++){ 
       // Loop over the fine columns 
       for(int smallcol = 0; smallcol < W; smallcol++){ 
        // If col and row are both even or uneven, we color 
        if(row % 2 == col % 2){ 
         std::cout << C; 
        }else{ 
         std::cout << " "; 
        } 

       } 
      } 
      // End of the small row, we need a new line 
      std::cout << std::endl; 
     } 
    } 

    return 0; 
} 

g++ -o main main.cpp編譯,然後用一些參數執行,例如echo "X 3 5 2" | ./main給了我一個很好的結果:

XXXXX  XXXXX  
XXXXX  XXXXX  
XXXXX  XXXXX  
    XXXXX  XXXXX 
    XXXXX  XXXXX 
    XXXXX  XXXXX 
XXXXX  XXXXX  
XXXXX  XXXXX  
XXXXX  XXXXX  
    XXXXX  XXXXX 
    XXXXX  XXXXX 
    XXXXX  XXXXX 
+0

感謝您的支持,它可以工作,但我想知道您是如何解決問題的。你用什麼算法來解決這個問題?我真的很想知道,謝謝你的幫助! – user3006937 2014-10-06 00:42:33

+0

這是一個蠻力算法。它循環遍歷每個「單元格」(C或「」)並決定將其繪製到哪裏。這就是'行%2 == col%2'條件非常重要的地方。 – tschoppi 2014-10-06 00:48:37

0

攻擊這類問題的方法是將其分解爲更小的問題,並繼續分解問題,直到最終完成可以輕鬆轉換爲代碼的非常小的任務。

例如,審查你的你想要做什麼提綱後,有一件事變得非常清楚:

比方說,我們使用標籤「邏輯行」是指文本的一個或多個物理行或包含棋盤格中一行圖像的字符串。在上例中,每個邏輯行由四個物理行組成。然後,首先變得非常清楚,給定N的任何值,您將創建N對邏輯行。在每對中,第一個邏輯行的棋盤格將在奇數列中,然後第二個邏輯行的偶數列中將會有棋盤格字符。

因此,我們可以自信地說,代碼,你想會是這個樣子的:

for (int i=0; i < N; ++i) 
{ 
    // Draw the odd checkboard logical row 

    // Draw the even checkboard logical row 
} 

所以,用N = 3你要與由六名的棋盤拉閘行,如你想要的輸出的例子。在N = 4的情況下,你會得到八個,依此類推。

現在,問題基本上減少到繪製單個邏輯棋盤行。然而,事情會變成這樣,所產生的代碼將會塞進這個for循環中。所以,我們可以放在一邊。

第二個易於分解的步驟是每個棋盤行由L行物理行組成。

所以,產生一個單一的邏輯棋盤行代碼將然後是這個樣子:

for (int j=0; j<L; j++) 
{ 
    // Draw a single line in a logical row. 
} 

這是每個奇數和偶數行的棋盤完成。進一步說,爲了避免代碼重複,你可以改進最終的結果,但是現在在for循環的第一次,第一次循環,第二次循環,第二次循環,第二次循環,

在這一步,原來的問題現在分解爲:繪製一個物理行。這應該很簡單,你可以借用你已經編寫的代碼,在你的問題中實現最終答案。