xtu 1403 菱形 思路清晰

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. 只使用/\,空格,回车四种字符。
  2. 行首无多余的空格,行末无空格。
  3. 菱形从上到下,从左到右,依次编码,从\(1\)\(n\),不要输出多余的菱形。
  4. 边长为\(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;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marhoosh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值