菱形 I | ||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 17 | Submit : 45 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description | ||
菱形题目描述按照给定小菱形的数量n,利用字符打印菱形,要求
具体格式见样例。 比如边长为3的菱形,最少有5个小菱形(左边的情况),最多有9个小菱形(右边的情况)。 /\ /\ /\/\ /\/\ /\/\/ /\/\/\ \/\/ \/\/\/ \/\/ \/ 对应的编号分别为 1 1 2 3 2 3 4 5 4 5 6 7 8 9 输入格式存在多个样例,每个样例是一个整数n(1≤n≤100)。如果n为0,表示输入结束,这个样例不需要处理。 输出格式依次按要求输出对应数量的菱形。 样例输入1 2 3 4 5 6 7 0 样例输出/\ \/ /\ /\/ \/ /\ /\/\ \/\/ /\ /\/\ \/\/ \/ /\ /\/\ /\/\/ \/\/ /\ /\/\ /\/\/\ \/\/\/ /\ /\/\ /\/\/\ \/\/\/ \/ |
思路很垃圾....但是不知道错哪里了,找了AC代码打印1-100文件比对也完全一致....
#include<stdio.h>
#include<math.h>
#include<string.h>
char a[60][60];
void solve(int n) {
if(n == 0) return;
int flag;
// while(scanf("%d",&n)&&n!=0){
double temp=sqrt(n);
int p;
p=int(temp);
if(p!=temp) p+=1; //边长;
int h=(p+1)*p/2;
if(n<=h) flag=1;
else flag=0;//要搞下一半
int abc=1,cnt2=0,cnt=0;
int line=p+1;
int cun=n;
while(n-h>0)
{
n-=p;
cnt2++;
n+=cnt2;
}
line+=cnt2;
for(int i=0;i<11;i++){
for(int j=0;j<=i;j++){
a[0+i][p+0-i+j*2]='/';
a[0+i][p+1-i+j*2]=92;
for(int s=p+1-i+j*2;s<=45;s++){
if(a[0+i][s]==' '){
a[0+i][s]='\0';
break;
}
}
a[1+i][p+0-i+j*2]=92;
a[1+i][p+1-i+j*2]='/';
for(int s=p+2-i+j*2;s<=45;s++){
if(a[1+i][s]==' '){
a[1+i][s]='\0';
break;
}
}
cnt++;
if(cnt==cun||cnt==h)
{
abc=0;
break;
}
}
if(abc==0) break;
} //上一半;
int move=0,sum=0;
if(flag==0){
for(int i=p+1;i<=line;i++){
move++;
cnt=0;
for(int j=0;j<=33;j++){
a[i][1+j*2+move]=92;
a[i][2+j*2+move]='/';
cnt++;
sum++;
if(cnt==p-1||sum==cun-h){
p-=1;
a[i][3+j*2+move]='\0';//结束符设置
break;
}
}
if(sum==cun-h) break;
}
}
//后半部分;
for(int i=0;i<line;i++){
// for(int j=1;j<=50;j++){
// printf("%c",a[i][j]);
// }
printf("%s\n", a[i] + 1);
}
// for(int i=0;i<=cun;i++){
// for(int j=1;j<=45;j++) a[i][j]=' ';
// }
memset(a,' ',sizeof(a));
//输出和清零。
// }
}
int main()
{
int x;
while(scanf("%d", &x) != EOF && x != 0) solve(x);
// freopen("a.out", "w", stdout);
// for(int i = 1; i <= 100; ++ i) printf("%d\n", i), solve(i);
return 0;
}