xtu 1403 菱形
菱形 I | ||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 132 | Submit : 374 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description |
菱形
题目描述
按照给定小菱形的数量\(n\),利用字符打印菱形,要求
- 只使用
/
,\
,空格,回车四种字符。 - 行首无多余的空格,行末无空格。
- 菱形从上到下,从左到右,依次编码,从\(1\)到\(n\),不要输出多余的菱形。
- 边长为\(a\)的大菱形,最少有\((a-1)^2 + 1\)个小菱形,最多有\(a^2\)个小菱形。
具体格式见样例。
比如边长为3的菱形,最少有5个小菱形(左边的情况),最多有9个小菱形(右边的情况)。
/\ /\ /\/\ /\/\ /\/\/ /\/\/\ \/\/ \/\/\/ \/\/ \/
对应的编号分别为
1 1 2 3 2 3 4 5 4 5 6 7 8 9
输入格式
存在多个样例,每个样例是一个整数\(n (1 \le n \le 100)\)。如果\(n\)为\(0\),表示输入结束,这个样例不需要处理。
输出格式
依次按要求输出对应数量的菱形。
样例输入
1 2 3 4 5 6 7 0
样例输出
/\ \/ /\ /\/ \/ /\ /\/\ \/\/ /\ /\/\ \/\/ \/ /\ /\/\ /\/\/ \/\/ /\ /\/\ /\/\/\ \/\/\/ /\ /\/\ /\/\/\ \/\/\/ \/
Sample Input
Sample Output
Source
思路在注释里有
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char ar[222][222];
int edge(int n){//返回菱形边长
for(int i=1;i<=10;i++){
if(n<=i*i) return i;
}
return 10;
}
//3.画出小菱形
void draw(int x,int y){
ar[x][y]=ar[x+1][y+1]='/';
ar[x][y+1]=ar[x+1][y]='\\';
}
//2.确定每个小菱形位置
int solve(int e,int n){//返回最后一行的行数
int cnt=0;
for(int i=1;i<=e;i++){
for(int j=0;j<e-i;j++) ar[i][j]=' ';//画行首空格
for(int j=1;j<=i;j++){
draw(i,e-i+2*(j-1));
cnt++;
if(cnt==n){
return i+1;
}
}
}
for(int i=e+1;i<2*e;i++){
for(int j=0;j<i-e;j++) ar[i+1][j]=' ';//画行首空格,注意这里是画的下一行的空格
for(int j=1;j<=2*e-i;j++){
draw(i,i-e+2*(j-1));
// cout<<i<<" "<<i-e+2*(j-1)<<endl;
cnt++;
if(cnt==n){
return i+1;
}
}
}
return 21;
}
void out(int l){//打印
for(int i=1;i<=l;i++) puts(ar[i]);//puts函数遇到'\0'停止,并自动在结尾加换行
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
while(cin>>n && n){
memset(ar,'\0',sizeof(ar));
//1.确定边长
int e=edge(n);
//4.返回最后一行的行数
int l=solve(e,n);
//5.打印
out(l);
}
return 0;
}