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;
}
原文地址:https://www.cnblogs.com/Friends-A/p/10324397.html