zoukankan      html  css  js  c++  java
  • PAT 1027 打印沙漏

    题目

    /*
     1027. 打印沙漏(20)
    
     本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
     
     *****
      ***
       *
      ***
     *****
     所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
     
     给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
     
     输入格式:
     
     输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
     
     输出格式:
     
     首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
     
     输入样例:
     19 *
     输出样例:
     *****
      ***
       *
      ***
     *****
     2
     */
    
    

    思路

    // 预处理:将 1000 以内所有数目的第一行*号个数和剩余个数求出来
    // 之后只要根据输入的数字输出即可
    // 边界条件使用线性规划
    

    代码

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    int num[1004];
    int rest[1004];
    
    void preHandle(){
    	int sum = 1;
    	int cnt = 1;
    	for (int i = 1; i < 1004; ++i) {
    		if (i >= sum) {
    			cnt += 2;
    			sum += cnt*2;
    		}
    		num[i] = cnt - 2;
    		rest[i] = i + cnt * 2 - sum;
    		
    	}
    }
    int main(){
    	
    	preHandle();
    	
    	int n;
    	char ch;
    	cin >> n >> ch;
    	int size = num[n];
    	for(int j = 0; j < size;++j){
    		for (int i = 0; i < size; ++i) {
    			if ((j <= i && j <= size - 1 - i)||(j >= i && j >= size - 1 - i)) {
    				cout << ch;
    			}else if ((j > i && j < size - 1 - i)) {
    				cout << ' ';
    			}else{
    				break;
    			}
    		}
    		cout << endl;
    	}
    	
    	cout << rest[n] << endl;
    	return 0;
    }
    

    注意点

    1. 一行中不能出现多余的空格。
    2. 不论是否有多余的字符都要显示出剩余字符。
  • 相关阅读:
    2019/10/9 CSP-S 模拟测
    简单的面向对象
    魔术变量
    函数
    全局变量
    超级全局变量
    for循环
    while循环
    php数组排序
    python打造XslGenerator
  • 原文地址:https://www.cnblogs.com/tangyikejun/p/4300390.html
Copyright © 2011-2022 走看看