只采用一个外循环和一个内循环语句画实心菱形

今天在床上刷手机,学弟的C++上机遇到了这么一道题目来求助我:

设计一个函数 void Drawdiamond(int n)  其功能是显示一个具有n行的实心菱形。

这里的n必须是一个奇数,且(3<=n<=21)。

该函数的实现代码之恩那个有一个外循环语句和一个内循环语句,不能多个循环并列。

画菱形 很容易,无非是上半部分一组循环,下半部分一组循环,可是此题对循环的数量做出了严格的限制。于是躺在床上的我想出了用线性规划的方式去解决此题。


我们设向下为Y轴正方向,向右为X轴正方向。则菱形的四个顶点都可以用含n的式子表示,分别是:

上顶点:( (n+1)/2,1 )

下顶点:( (n+1)/2,n )

左顶点:( 1,(n+1)/2 )

右顶点:( n,(n+1)/2 )


那么我们很容易得到菱形四条边的线性方程:

y=-x+(n+3)/2

y=x+(n-1)/2

y=-x+(3n+1)/2

y=x+(1-n)/2

然后我们就使用线性规划的知识,界定实心菱形所在的区域。

这里要特别注意的是,由于y轴方向相反,所以对于是大于等于还是小于等于要搞清楚。

有:

x + y  >= (n + 3) / 2

 y - x  <= (n - 1) / 2

 x + y <= (3 * n + 1) / 2 

y - x   >= (1 - n) / 2

最后根据是否在指定区域内,令其输出" * "或空格就行了。

下面是源代码:

#include<iostream>
using namespace std;
void Drawdiamond(int n) {
	int x, y;
	for (x = 1; x <= n; x++) {
		for (y = 1; y <= n; y++) {
			if ((x + y) >= ((n + 3) / 2) && 
                (y - x) <= ((n - 1) / 2) &&
                (x + y) <= ((3 * n + 1) / 2) && 
                (y - x) >= ((1 - n) / 2))
				cout << "*";
			else cout << " ";

		}
		cout << endl;
	}

}
void main(void) {
	Drawdiamond(7);
	Drawdiamond(11);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值