解题思路:1、利用两个数组进行操作,可以把DNA的规律进行保存(两个规律):(我把0当作空格)
举个例子:
X000X
0X0X0
00X00
0X0X0
X000X
不知道大家有没有发现,规律1:在X左边的0的个数向下依次形成0,1,2,1,0,接下来继续是,1,2,1,0...往复下去,形成,0,1,2,1每4次循环一次,用数组a保存起来,循环条件为a/2(因为2最大不超过a的一半,即2为中间的数); for(i=0;i<a/2;i++) 用来保存0,1,2;for(int aa=a/2;aa>=1;aa--,i++) 用来保存中间数后面剩余的数。(空格规律的长度为a-1)
规律2:两头”X“夹着的空格,个数形成的规律是3,1,0,1,3,1,0,1...可以看出是3,1,0,1;每个数相差2,保存在数组b中,同理,因为3最大,而且3等于(a-2);for(i=a-2;i>=0;i-=2,k++) 用来保存3,1;而0单独保存跟在后面b[k]=0;k++;而0后面数则用for(i=1;i<a-2;i+=2,k++) 进行保存。
规律3:输出的结果都是与行数重复度有关联的,例如5行4重复,长度为17行,17=5*4-4+1;
因为从前面的2个规律看出,我们是可以不用控制什么时候结束的,我们只需要控制两个数组一直在规律之间往复循环就可以了。
还有就是最右边的空格完全不用管,就当是摆设。
注意事项:
1、注意每次输入新的数的时候,都需要初始化部分数值
2、别忘了题目要求的换行
3、”X“是大写,实在看不出来的可以复制个”X“到文本中看就知道了。
参考代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int main()
{
int n,x,y,aa,c=0,k=0,d=0; //定义,d控制数组循环
int a[1000],b[1000],i,j,r,t;
cin>>n;
while(1)
{
k=0; //每次都初始化
if(n<=0) break; //循环退出条件
cin>>x>>y; //输入
for(i=0;i<x/2;i++) //保存控制左边的空格
a[i]=i;
for(aa=x/2;aa>=1;aa--,i++) //保存控制左边空格
a[i]=aa;
for(i=x-2;i>=0;i-=2,k++) //保存控制中间的空格
b[k]=i;
b[k]=0;k++; //中间0单独保存,k自增1次
for(i=1;i<x-2;i+=2,k++)
b[k]=i;
c=0;k=0;d=0; //每次都初始化,使其数组下标从0开始
for(i=0;i<x*y-y+1;i++) //总行数
{
for(r=0;r<a[c];r++) //控制左边空格的输出
cout<<" ";
cout<<"X"; //只输出一次
for(t=0;t<b[k];t++) //控制中间空格的输出
cout<<" ";
if(b[k]!=0) //如果b[k]不等于0,那么在X图案的对称中心就会有2个大x在一起,但是只有一个。
cout<<"X"; //末尾直接加“X”即可!
cout<<endl; //换行
c++;k++;d++; //每次输出完一行自增1
if(d==x-1) //让数组进行循环,左边的空格规律的个数是X-1,满足后执行语句
{
c=0;k=0;d=0; //满足条件之后数组又重新开始。
}
}
cout<<endl; //记住题目的要求空出一行
n--; //判断退出整个循环
}
return 0;
}
0.0分
0 人评分
WU-printf基础练习2 (C++代码)浏览:2061 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:672 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:651 |
printf基础练习2 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |
Hello, world! (C语言代码)浏览:916 |
简单的a+b (C语言代码)浏览:617 |
简单的a+b (C语言代码)浏览:672 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:584 |
小九九 (C++代码)简单粗暴,直接输出浏览:683 |