蓝桥杯 基础练习 回形取数 (vip)附解析C++

版权声明:(整理不易,如本文对您有益,请为我点赞吧!)本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Qi2456/article/details/88082209

基础练习 回形取数 

解析(同时参考代码会容易理解)

对于题目,从左上角开始,按箭头方向(如下图),一圈是一个循环。

 

循环次数计算:m行n列,取最小值折半计算。

一个循环内是4个小循环。

特别注意的是:

①在最后一个循环,且m为奇数 的时候,会多输出第三个小循环。

②在最后一个循环,且n为奇数 的时候,会多输出第四个小循环。

所以在以上两种情况下,就不需输出第三四个小循环。

代码

#include<bits/stdc++.h>
using namespace std;
int mmax(int x,int y)
{
    return x<y?x:y;
}
int main()
{
    int m,n;
    int a[210][210];
    cin>>m>>n;
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            cin>>a[i][j];
    int r=(mmax(m,n)+1)/2;//循环次数
    for(int k=0; k<r; k++)
    {
        if(k==r-1&&m%2==1)//最后一个循环,且m为奇数
        {
            for(int i=k; i<m-k; i++)
            {
                if(k==0&&i==0)
                    cout<<a[0][0];
                else
                    cout<<" "<<a[i][k];
            }
            for(int j=k+1; j<n-k; j++)
            {
                cout<<" "<<a[m-1-k][j];

            }
        }
        else if(k==r-1&&n%2==1)//在最后一个循环,且n为奇数
        {
            for(int i=k; i<m-k; i++)
            {
                if(k==0&&i==0)
                    cout<<a[0][0];
                else
                    cout<<" "<<a[i][k];
            }
            for(int j=k+1; j<n-k; j++)
            {
                cout<<" "<<a[m-1-k][j];

            }
        }
        else
        {
            for(int i=k; i<m-k; i++)//第一个小循环
            {
                if(k==0&&i==0)
                    cout<<a[0][0];
                else
                    cout<<" "<<a[i][k];
            }
            for(int j=k+1; j<n-k; j++)//第二个小循环
            {
                cout<<" "<<a[m-1-k][j];

            }
            for(int i=m-2-k; i>=k; i--)//第三个小循环
            {
                cout<<" "<<a[i][n-1-k];

            }
            for(int j=n-2-k; j>=k+1; j--)//第四个小循环
            {
                cout<<" "<<a[k][j];
            }
        }

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Qi2456/article/details/88082209
今日推荐