打印十字

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector> 
#include<string>
#include<queue>
#include<map>
#include<stack>
using namespace std; 
char mp[205][205];
void dh(int a,int b,int i)    //横线 
{
    for(int k=a;k<=b;k++)
        mp[i][k] = '$';
}
void dv(int a,int b,int j)    //竖线 
{
    for(int k=a;k<=b;k++)
        mp[k][j] = '$';
}
void dt(int i,int j,int x,int y,int n)    //左上角,右下角起始点和层数,得到第n层的外部轮廓图 
{
    int j1,j2,j3,j4,midj;
    int i1,i2,i3,i4,midi;

    j1 = j-2;
    j2 = j;
    j3 = y;
    j4 = y+2;
    i1 = i;
    i2 = i+2;
    i3 = x-2;
    i4 = x;
    
    if(n==1)
    {
        midi = (i2+i3)/2;
        midj = (j2+j3)/2;
        dh(j1+2,j4-2,midi);
        dv(i2,i3,midj);
    }
    
    dh(j2,j3,i1);
    dh(j1,j2,i2);
    dh(j3,j4,i2);
    dh(j1,j2,i3);
    dh(j3,j4,i3);
    dh(j2,j3,i4);
    
    dv(i1,i2,j2);
    dv(i1,i2,j3);
    dv(i2,i3,j1);
    dv(i2,i3,j4);
    dv(i3,i4,j2);
    dv(i3,i4,j3);
}
//思路:画出图形轮廓,设初始点坐标(i,j),将各转折点坐标用i,j表示,
int main()
{
    int n;
    cin>>n;
    int len = 5 + 4*n;
    for(int i=0;i<len;i++)
        for(int j=0;j<len;j++)
            mp[i][j] = '.';
    
    for(int k=n,p=0;k>=1;k--,p++)
    {
        int i = 2*p;
        int j = 2 + 2*p;
        int x = len - 1 - 2*p;
        int y = len - 3 - 2*p;
        dt(i,j,x,y,k);
    } 
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<len;j++)
        {
            //cout<<mp[i][j]<<" ";        错误点,输出无用的空格 
            cout<<mp[i][j]; 
        }
        if(i!=len-1)cout<<endl;
    }
    return 0;
}

 

posted @ 2019-03-19 19:28  萌新上路  阅读(107)  评论(0编辑  收藏  举报