打印大X
小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。
要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
要求输出一个大X
例如,用户输入:
3 9
程序应该输出:(如有对齐问题,参看【图1.jpg】)
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***
再例如,用户输入:
4 21
程序应该输出
****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****
好!
我数了一下
题目给的m是4,n是21的时候,行宽是24.
m是3,n是9的时候,行宽是13.。
(我好像发现了个不得了的大秘密)
行宽 = m + n -1;
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
scanf("%d %d",&m,&n);//m表示笔的宽度,n表示x的高度
int a = m+n-1;//每一行的宽度
int i,j,k;
for(i = 0;i<=n/2;i++)//先搞上半边的
{
for(j = 0;j<a;j++)
{
if(( j>=i && j<m+i )||( j>=n-1-i && j<n-1-i+m ))//这||前面是前面的m位*,后面是后面的*,减少重叠的时候的判断了。
{
cout<<'*';
}
else cout<<'.';
}
cout<<endl;
}
for(i = n/2-1;i>=0;i--)//倒过来再来一波
{
for(j = 0;j<a;j++)
{
if(( j>=i && j<m+i )||( j>=n-1-i && j<n-1-i+m ))//这||前面是前面的m位*,后面是后面的*,减少重叠的时候的判断了。
{
cout<<'*';
}
else cout<<'.';
}
cout<<endl;
}//不能说是一模一样,只能说是分毫不差.
cout<<endl;
}
艰难!
运用题给示例,答案正确。