问题 : 回形取数
时间限制: 1 Sec 内存限制: 128 MB提交: 26 解决: 13
[ 提交][ 状态]
题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
3 2
1 2
3 4
5 6
样例输出
1 4 7 8 9 6 3 2 5
1 3 5 6 4 2
题意概括:从左上角开始,逆时针像旋涡一样将整个矩形的数。
解题思路:输入矩形之后,设置一个外循环,每输出一个数就进行sum累加,当累加结果等于矩阵的数的数目总和时,跳出外循环。外循环内有四个并列的内循环,分别输出矩阵靠左边的列,矩阵靠下面的行,矩阵靠右边的列,矩阵靠上面的行。同时用book标记已经输出的数(防止重复输出)。
AC代码:
#include<stdio.h>
int main(void)
{
int n, m;
int i, j, sum = 0;
int book[205][205] = {0}, a[205][205];
int q, k, v, u;
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= m; j ++)
{
scanf("%d", &a[i][j]);
}
}
i= 1;
k = n;
v = m;
u = 1;
for(q = 1;;q ++)
{
for(j = 1; j <= n; j ++)
{
if(book[j][i] == 0)
{
printf("%d ", a[j][i]);
book[j][i] = 1;
sum ++;
}
}
i ++;
for(j = 1; j <=m; j ++)
{
if(book[k][j] == 0)
{
printf("%d ", a[k][j]);
book[k][j] = 1;
sum ++;
}
}
k --;
for(j = n; j >= 1; j --)
{
if(book[j][v] == 0)
{
printf("%d ", a[j][v]);
book[j][v] = 1;
sum ++;
}
}
v--;
for(j = m; j >= 1; j --)
{
if(book[u][j] == 0)
{
printf("%d ", a[u][j]);
book[u][j] = 1;
sum ++;
}
}
u ++;
if(sum == n * m)
{
break;
}
}
printf("\n");
return 0;
}
错误原意:无错误,一次过。