带有偶数c ++的星号钻石

时间:2014-09-16 03:25:20

标签: c++

我试图找出如何使用偶数来制作这样的东西;

输入制作菱形图案所需的行数:6

  *
 ***
*****
*****
 ***
  *

我继续增加一行。

   *
  *** 
 *****
*******
 *****
  ***
   *

以下是代码:

#include<iostream> 
#include<cstdlib>
using namespace std;

int main()
{

int NUM = 6;


int i=0, j=0; 
//NUM=NUM-1;
for(i=-NUM; i<=NUM-1; i++)
{
    //cout<<i<<"part1";
    for(j=-NUM; j<=NUM-1; j++)
    {
         //cout<<j<<"part2";
         if(abs(i)+abs(j)<=((NUM-1)/2+1))
         {
              cout<<"*";}
         else
         {
              cout<<" ";}
    }
cout<<endl;
}

system("PAUSE");
return 0;
}

任何提示?

2 个答案:

答案 0 :(得分:0)

将每行设想为两个数字:x)空格数和y)星数。所以对于你的例子,你得到:

i  x y 
------
0: 2 1
1: 1 3
2: 0 5

2: 0 5
1: 1 3
0: 2 1

观察到下半部分只是“颠倒”的上半部分,这意味着倒数。

现在,创建一个从i转换为xy的表达式。例如x=2-i似乎有效(可能更复杂,但现在让我们试试)。与y做类似的事情。现在使用以下伪代码编写代码。

for i=0..2
    for x (which is some expression involving i)
        write a space
    for y (which is some expression involving i)
        write a star
    write a newline

for i=2..0
   (repeat above, better yet, write a function to do it call it twice

或者,当表格如下所示时,您可以对计算机xy使用if语句:

i  x y 
------
0: 2 1
1: 1 3
2: 0 5
3: 0 5
4: 1 3
5: 2 1

例如:x2-i,当i <3时,i-3为<{p}}。

答案 1 :(得分:0)

由于您的输出是对称的,因此有助于对算法进行划分,使其以对称方式工作。

对于N = 6,您需要6行和5列。

您可以让外部循环中的索引上升0, 1, 2,然后降低2, 1, 0

你可以让内循环的索引变为-2, -1, 0, 1, 2

然后,给定i(外部循环的索引)和j(内部循环的索引),如果出现以下情况,则该地点为空白区域:

(i+j) < 0 || (i+j) > i*2

现在程序可以是:

int isWhite(int i, int j, int NUM)
{
   return ((i+j) < 0 || (i+j) > i*2);
}

void drawDots(int i, int NUM)
{
   // j = -2, -1, 0, 1, 2
   int j = 0;
   for( j = -(NUM-1)/2; j < NUM/2; ++j)
   {
      if( isWhite(i, j, NUM) )
      {
         cout<<" ";
      }
      else
      {
         cout<<"*";
      }
   }
}

int main()
{
   int NUM = 6;
   int i=0; 

   // i = 0, 1, 2
   for ( i = 0; i < NUM/2; ++i )
   {
      drawDots(i, NUM);
      cout<<endl;
   }

   // i = 2, 1, 0
   for ( i = NUM/2-1; i >= 0; --i )
   {
      drawDots(i, NUM);
      cout<<endl;
   }

   return 0;
}

<强>更新

如果您不介意使用使用本地数据中的数据的代码替换drawDots块,那么

if/else可以更加简化。

void drawDots(int i, int NUM)
{
   char s[] = "* ";
   // j = -2, -1, 0, 1, 2
   int j = 0;
   for( j = -(NUM-1)/2; j < NUM/2; ++j)
   {
      cout << s[isWhite(i, j, NUM)];
   }
}