打印十字图形

问题描述

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。

本来看到这道题我都不太想做了,可是我发现这样不好,现在不做,之后比赛我更做不出来。首先我把图画下来找规律,很容易发现这个图形是中心对称(不考虑宽窄的话),于是我想到了只找图形的四分之一或者八分之一的规律,然后就用对称把图形弄完整,于是我空想了很久,找了挺多规律,但我又觉得自己找到的规律不好实现。于是我就百度了。。。。看了许多人总结的,我发现有的人真的超级不怕麻烦,可能找下来的规律不是最简便的,但别人至少写出代码了。于是我受到了鼓舞。我用的是我在网上看见的我觉得最简单的规律,就是把那四分之一分成三部分,实现起来也比较简单。

还有我中间出现了一个问题,我发现在写代码用到一个变量的时候,一定要确定这个变量的初始值是不是你想要的。

下面是代码

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int pic(int n)
{
	int row,col,cen;
	int x=0,y=0,i;//用xy我比较容易分清楚行列 
	char a[130][130];
	row=9+(n-1)*4;
	col=9+(n-1)*4;//算出行列数
	cen=(row-1)/2;//算出中心
	//先把.放进数组
	  for(x=0;x<row;x++)
	  {
	  	
	  	for(y=0;y<col;y++)
	  	{
	  	a[x][y]='.'; 
		  }
	   } 
	//给b区赋值
	for(i=cen;i>0;i=i-2)
	{
		a[i][i]='$';
		a[i-1][i]='$';
		a[i][i-1]='$';
		
	 } 
	 //给a区赋值
	 x=0;
	 for(y=0;y<=(cen-2);y=y+2)//在列上循环 
	 {
	 	x=x+2;//行开始的地方 
	 	for(i=x;i<=cen;i++)//在行中循环画多少个$
		 {
		 	a[i][y]='$';
		 	
		  } 
	 	
	  } 
	  //给c区赋值
	  y=0;
	  for(x=0;x<=(cen-2);x=x+2)//在行上循环 
	 {
	 	y=y+2;//列开始的地方 
	 	for(i=y;i<=cen;i++)//在列中循环画多少个$
		 {
		 	a[x][i]='$';
		 	
		  } 
	 	
	  } 
	  //开始对称赋值
	 //y轴对称
	 for(y=0;y<=cen;y++)
	 {
	 	 for(x=row-1;x>cen;x--)
	 {
	 	a[x][y]=a[row-x-1][y];
	 	
	  } 
	 }
	 //x轴对称
	 for(x=0;x<row;x++)
	 {
	 	for(y=col-1;y>cen;y--)
	 	{
	 		
	 		a[x][y]=a[x][col-y-1];
		 }
	 	
	  } 
	  //输出
	  for(x=0;x<row;x++)
	  {
	  	
	  	for(y=0;y<col;y++)
	  	{
	  		printf("%c",a[x][y]);
	  		
		  }
		  printf("\n");
	   } 
	
	  
	 
	return 0;
 } 
int main() {
	int n;
	scanf("%d",&n);
	pic(n);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值