题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入 Copy
3 3 1 2 3 4 5 6 7 8 9
样例输出 Copy
1 4 7 8 9 6 3 2 5
这是第一次写出来的代码,由于没有考虑到一些特殊情况导致AC:64%
#include <iostream>
using namespace std;
int a[201][201];
int main()
{
int m, n;
cin>> m >> n;
for(int i = 0;i < m;i ++ )
for(int j = 0;j < n;j ++ )
cin>> a[i][j];
int t = (min(m, n) + 1) / 2;
for(int i = 0;i < t;i ++ )//以需要回形的圈数为循环条件
{
int j = i;
int k = i;
while(k < (m - i))//向下打印输出
{
if(k == 0 && j == 0)
cout<< a[k][j];
else
cout<< ' ' << a[k][j];
k ++ ;
}
k = k - 1;
j = j + 1;
while(j < (n - i))//向右打印输出
{
cout<< ' ' <<a[k][j];
j ++ ;
}
j = j - 1;
k = k - 1;
while(k >= i)//向上打印输出
{
cout<< ' ' << a[k][j];
k -- ;
}
k = k + 1;
j = j - 1;
while(j > i)//向左打印输出
{
cout<< ' ' << a[k][j];
j -- ;
}
}
return 0;
}
这是最后成功的代码
#include <iostream>
using namespace std;
int a[201][201];
int main()
{
int m, n;
cin>> m >> n;
for(int i = 0;i < m;i ++ )
for(int j = 0;j < n;j ++ )
cin>> a[i][j];
int i = 0;
int counts = m * n;
while(counts)//以数组的个数为循环条件
{
int j = i;
int k = i;
while(k < (m - i) && counts)
{
if(k == 0 && j == 0)
cout<< a[k][j];
else
cout<< ' ' << a[k][j];
counts -- ;
k ++ ;
}
k = k - 1;
j = j + 1;
while(j < (n - i) && counts)
{
cout<< ' ' <<a[k][j];
counts -- ;
j ++ ;
}
j = j - 1;
k = k - 1;
while(k >= i && counts)
{
cout<< ' ' << a[k][j];
counts -- ;
k -- ;
}
k = k + 1;
j = j - 1;
while(j > i && counts)
{
cout<< ' ' << a[k][j];
counts -- ;
j -- ;
}
i ++ ;
}
return 0;
}
在进行第一版代码的排错过程中,我发现会出现如下图的错误情况,根据代码初步推断得出,由于以7开头的第二圈打印只需要向右打印即可,而第一版代码没有考虑到该种情况,于是决定使用数组中元素个数来作为循环的条件,并且值得注意的是需要在每次向下、向左、向上、向右操作时,加上条件判断counts是否为0