基础练习 回形取数
解析(同时参考代码会容易理解)
对于题目,从左上角开始,按箭头方向(如下图),一圈是一个循环。
循环次数计算: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;
}