• HPU第四次积分赛-K :方框(水题,打印图形)


    方框

    描述

    用'*'打印出一个nxn的字符图形(1<=n<=100).

    输入

    多组输入。每行输入一个n,输入EOF结束文件.

    输出

    输出一个满足题意的图形.

    输入样例 1 

    1
    2
    5
    6
    10
    11
    

    输出样例 1

    *
    **
    **
    *****
    *   *
    * * *
    *   *
    *****
    ******
    *    *
    * ** *
    * ** *
    *    *
    ******
    **********
    *        *
    * ****** *
    * *    * *
    * * ** * *
    * * ** * *
    * *    * *
    * ****** *
    *        *
    **********
    ***********
    *         *
    * ******* *
    * *     * *
    * * *** * *
    * * * * * *
    * * *** * *
    * *     * *
    * ******* *
    *         *
    ***********

    思路

    就是按照给出的样例找规律,然后n*n的图形

    可以明显的看出,这个图形的特点是一圈被全是*,一圈全是空白。发现了这个规律的话可以用模拟来做(学长和一些用模拟AC的大佬说的,但是感觉模拟好麻烦,不太好写)

    再仔细观察可以发现:这个图形是个对称的(废话)。然后从第三行开始往后,每一行都是根据上上一行的字符串复制过来,然后将上上一行的连在一起的空格或者*的第二个和倒数第二个给改变(*变成空格,空格变成*)。最后输出的时候判断奇偶,对称输出就可以了

    AC代码

    #include<bits/stdc++.h>
    #define ll long long
    #define ms(a) memset(a,0,sizeof(a))
    using namespace std;
    const int maxn=1e6+10;
    char ch[110][110];
    int main()
    {
        ios::sync_with_stdio(false);
        int n;
        while(cin>>n)
        {
            if(n==1)
            {
                cout<<"*"<<endl;
                continue;
            }
            if(n==2)
            {
                for(int i=1;i<=2;i++)
                    cout<<"**"<<endl;
                continue;
            }
            ms(ch);
            int res=(n+1)/2;
            int cnt=2;
            for(int i=1;i<=res;i++)
            {
                if(i==1)
                {
                    for(int j=1;j<=n;j++)
                        ch[i][j]='*';
                }
                if(i==2)
                {
                    ch[i][1]='*';
                    ch[i][n]='*';
                    for(int j=2;j<n;j++)
                        ch[i][j]=' ';
                }
                if(i>2&&i%2)
                {
                    // 本来是用strcmp来复制的,但是好像二维的字符串函数不能用,复制出来的全是空行
                    for(int k=1;k<=n;k++)
                    {
                        ch[i][k]=ch[i-2][k];
                    }
                    ch[i][cnt]=' ';
                    ch[i][n-cnt+1]=' ';
                    cnt++;
                }
                if(i>2&&i%2==0)
                {
                    for(int k=1;k<=n;k++)
                    {
                        ch[i][k]=ch[i-2][k];
                    }
                    ch[i][cnt]='*';
                    ch[i][n-cnt+1]='*';
                    cnt++;
                }
            }
            for(int i=1;i<=res;i++)
            {
                for(int j=1;j<=n;j++)
                    cout<<ch[i][j];
                    cout<<endl;
            }
            if(n%2)
            {
                 for(int i=res-1;i>=1;i--)
                {
                    for(int j=1;j<=n;j++)
                        cout<<ch[i][j];
                    cout<<endl;
                }
            }
            else
            {
                for(int i=res;i>=1;i--)
                {
                    for(int j=1;j<=n;j++)
                        cout<<ch[i][j];
                    cout<<endl;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Javascript:三个函数ceil()、floor()、round()的区别
    一次搞懂建模语言UML
    firewalld 指定IP访问某端口
    Java通过图片url地址获取图片base64位字符串的两种方式
    个人笔记 截止2013.05.08
    解决ie6、7 marginbottom 失效问题
    jQuery 初学
    大小不固定的图片和多行文字的垂直水平居中(转)
    border :before :after 的应用
    关于<pre></pre>标签 IE6,7下实现whitespace:prewrap;
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324397.html
Copyright © 2020-2023  润新知