打印十字
#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; }