2065: 打印十字图
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 55 Solved: 37
[Submit][Status][Web Board]
Description
Input
一个正整数 n (n<30) 表示要求打印图形的层数。
Output
对应图形
Sample Input
1
Sample Output
见链接
HINT
Source
解题思路:
这题训练赛的时候没有做出来真的想敲死自己……后来在网上看了大佬的题解觉得很有意思。这个图形是一个中心对称图形,所以只需要算以下一个八分之一的小三角就行。
//n=3
.
..
$$$
$...
$.$$$
$.$...
$.$.$$$
$.$.$...
$.$.$.$$$
这个小三角的规律也很明显。
1.当i<=2 && j<=2时输出“.”
2.奇数行,当j>=i-2时输出“¥”
3.奇数列,当j!=i-1时输出输出“¥”
但是这只是八分之一的小三角,要把上面的八分之一小三角补全变成四分之一图形,因为对称,所以只需要i,j互换即可。
打印出四分之一图形之后就很方便了,利用对称性质将横纵坐标转换到左上角的图形就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int f(int i,int j)
{
if(i>2*n+3)i=4*n+6-i;
if(j>2*n+3)j=4*n+6-j;
if(j>i)swap(j,i);
if(i<=2 && j<=2)return 0;
if(i%2!=0 && j>=i-2)return 1;
if(j%2!=0 && j!=i-1)return 1;
return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=4*n+5;i++){
for(int j=1;j<=4*n+5;j++){
if(f(i,j))cout<<"$";
else cout<<".";
}
cout<<endl;
}
return 0;
}