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
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<
            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;
}


你可能感兴趣的:(#,128,模拟考试,xtu)