小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
(上面图如果对齐不标准,可以拷到记事本中查看,找规律)
当n=4的时候,图形如下图所示
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入
一个正整数 n (n<30) 表示要求打印图形的层数。
输出
对应包围层数的该标志。
样例输入
1
复制
样例输出
..$$$$$.. ..$...$.. $$$.$.$$$ $...$...$ $.$$$$$.$ $...$...$ $$$.$.$$$ ..$...$.. ..$$$$$..
#include<bits/stdc++.h>
using namespace std;
int f[4][2]={0,1,1,0,-1,0,0,-1};
int n;
char a[500][500];
int judge(int x,int y,char flag){
int b[8][2]={0,1,1,0,-1,0,0,-1,1,1,-1,1,1,-1,-1,-1};
for(int i=0;i<8;i++){
int x1=x+b[i][0];
int y1=y+b[i][1];
if(x1>0&&y1>0&&x1<=5+4*n&&y1<=5+4*n&&a[x1][y1]==flag){
return 1;
}
}
return 0;
}
void dfs(int x,int y,char flag){
for(int i=0;i<4;i++){
int x1=x+f[i][0];
int y1=y+f[i][1];
if(x1>0&&y1>0&&x1<=5+4*n&&y1<=5+4*n&&a[x1][y1]=='q'&&judge(x1,y1,flag))
{
a[x1][y1]=flag=='$'?'.':'$';
dfs(x1,y1,flag);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=5+4*n;i++){
for(int j=1;j<=5+4*n;j++){
a[i][j]='q';
}
}
// 初始化中间的十字
a[2*n+1][2*n+3]='$';
a[2*n+2][2*n+3]='$';
a[2*n+3][2*n+3]=a[2*n+3][2*n+1]=a[2*n+3][2*n+2]=a[2*n+3][2*n+4]=a[2*n+3][2*n+5]='$';
a[2*n+4][2*n+3]='$';
a[2*n+5][2*n+3]='$';
//深搜贴着标志字符赋值就行了
int k=0;
for(int i=1;i<=2*n;i++){
if(k==0){
dfs(2*n+5+i,2*n+3,'$');
k=1;
}else{
dfs(2*n+5+i,2*n+3,'.');
k=0;
}
}
for(int i=1;i<=5+4*n;i++){
for(int j=1;j<=5+4*n;j++){
if(a[i][j]=='q'){
a[i][j]='.';
}
cout<<a[i][j];
}
cout<<endl;
}
}