今天在床上刷手机,学弟的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);
}