蓝桥杯练习(3)

题目 1097: 蛇行矩阵

时间限制: 1Sec 内存限制: 64MB

题目描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
输出
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
样例输入
5

样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

稍微有一点绕不过这一题并不是很难

可以利用直线公式去做这道题

下面这个是我自己的写法

中间变量稍微有点多所以看起来会比较杂

#include<iostream>
using namespace std;

int main(){
    int n=0;
    int out=1;
    int middle=1;
    int change1=2;
    int change2=1;
    
    cin >>n;
    int n1 = n;
    
    for(int i=0;i<n;i++){
        for(int j=0;j<n1;j++){
            cout<<out<<" ";
            out=out+change1;
            change1++;
        }
        cout<<endl;
        n1 = n1-1;
        out = middle+change2;
        middle = out;
        change2++;
        change1 = 7-n1;
    }
    
    return 0;
}

题目 1115: DNA

时间限制: 1Sec 内存限制: 128MB 提交: 9493 解决: 3278

题目描述

小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词–DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧

输入

输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。

输出

输出DNA的形状,每组输出间有一空行。

样例输入
2
3 1
5 4
样例输出
X X
 X
X X

X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X

我的想法是这样的

用一个二维数组去存放将要输出的一个序列

例如3*3的矩阵

它有x的下标就是00 02 11 20 22

放大到全体如果用i和j来表示的话

就是ii ij ji jj加上最中间的一项

由此可以递归来输出

而之后重复的部分由于头尾相连

所以除了第一个需要全输出

之后的都只要输出除第一行以外剩下的就行了

但是实际操作的时候遇到了奇怪的bug

在大于3的矩阵上的第一行输出会有问题

以下是错误的代码

如果有路过的大佬能帮忙完善下就好了

#include<iostream>
using namespace std;

void Group(int a, int b){
    
    if(a%2==0 || a<3 || a>39){
        system("pause");
    }
    if(b<1 || b>20){
        system("pause");
    }
    
    char DNA[a+1][a+1]={0};
    int change1=a/2;
        
    for(int i=0;i<change1;i++){
        int j=(a-1-i);	
        DNA[i][i]='x';
        DNA[j][i]='x';
        DNA[i][j]='x';
        DNA[j][j]='x';	
    }
    DNA[change1][change1]='x';
    
    for(int i=0;i<a;i++){
        for(int j=0;j<a+1;j++){
            cout<<DNA[i][j];
        }
        cout<<endl;
    }
    
    for(int k=0;k<b-1;k++){
        for(int i=1;i<a;i++){
            for(int j=0;j<a+1;j++){
                cout<<DNA[i][j];
            }
            cout<<endl;
        }
    }
    
}

int main(){
    int N=0;
    int a=0,b=0;
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>a;
        cin>>b;
        Group(a,b);
        cout<<endl;
    }		
    return 0;
}

下面这个是优秀题解的思路

我觉得确实有点道理

这是一个5*5的矩阵

只看1,2行的话

第一行头和尾有x

第二行正好是头和尾分别向中间进行交换一次后得到的顺序

总的思路就是把这一个矩阵转化成一行输出

先输出完整的第一行

然后通过递归的方法对头和尾的x进行不停的交换

直到满足最后的矩阵

递归的次数也就是每组DNA输出的次数

等于(a*b)-( b-1 )

也就是行数×组数再减去重复的b-1行(因为第一组不算所以减一)

参考代码如下

#include <iostream>
using namespace std;
 
void output( int A, int N, int p, int q );    //输出每一行
 
 
char dna[40];
void initialize_dna( int A );           //得到第一行
 
 
/*--------------------------------------*/
int main()
{
    int N, A, B;
 
    cin >> N;
    for ( int i = 0; i < N; i++ )
    {
        cin >> A >> B;
        initialize_dna( A );
        output( A, A * B - (B - 1), 0, A - 1 );
    }
 
    return(0);
}
 
 
/*--------------------------------------*/
void initialize_dna( int A )
{
    dna[0]        = 'X';
    dna[A - 1]    = 'X';
    for ( int i = 1; i < A - 1; i++ )
        dna[i] = ' ';
}
 
 
/*--------------------------------------*/
 
void output( int A, int N, int p, int q )
{
    char termp, termq;
 
    if ( N == 0 )
    {
        cout << endl; return;
    }else
 
        for ( int i = 0; i < A; i++ )
            cout << dna[i];
    cout << endl;
 
    /*-------------------------------*/
    if ( p == A - 1 && q == 0 )              //输出一轮了,重置p,q
    {
        p = 0; q = A - 1;
    }
 
    termp    = dna[p];
    termq    = dna[q];
 
    dna[p] = dna[p + 1];
 
    p++;
 
    dna[q] = dna[q - 1];
 
    q--;
 
    dna[p]    = termp;
    dna[q]    = termq;
    /*-------------------------------*/
 
    output( A, N - 1, p, q );           //输出下一行
}

 

发表评论

您的电子邮箱地址不会被公开。