1710819070


私信TA

用户名:1710819070

访问量:16115

签 名:

好好学习

等  级
排  名 334
经  验 5382
参赛次数 6
文章发表 21
年  龄 0
在职情况 学生
学  校 贺州学院
专  业 软件工程

  自我简介:

1+1+1+1+1+1=田

解题思路: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 人评分

  评论区

  • «
  • »