2014-10-06 226 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循环的第一次,第一次循环,第二次循环,第二次循环,第二次循环,

在这一步,原来的问题现在分解为:绘制一个物理行。这应该很简单,你可以借用你已经编写的代码,在你的问题中实现最终答案。