回形取数 蓝桥杯 C语言
Description
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
Input
输入描述:
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输入样例:
3 3
1 2 3
4 5 6
7 8 9
Output
输出描述:
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
输出样例:
1 4 7 8 9 6 3 2 5
Sample Input 1
参考上文
Sample Output 1
参考上文
Hint
HINT:时间限制:1.0s 内存限制:512.0MB
Source
代码
#include <stdio.h>
int main(){
int m,n;
scanf("%d%d",&m,&n);
int a[m][n];
int i,j,sum;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
//输入数据
sum=m*n; //sum控制遍历所有数组
i=-1;j=0;
while(sum){
while(a[++i][j]!=-1 && i<m){
printf("%d ",a[i][j]);
a[i][j]=-1;
sum--;
}
//左列-向下,每遍历一个值变为-1,成为控制向左转的条件之一
i--; //此时i=m,
while(a[i][++j]!=-1 && j<n){
printf("%d ",a[i][j]);
a[i][j]=-1;
sum--;
}//底行-向右
j--;
while(a[--i][j]!=-1 && i>-1){
printf("%d ",a[i][j]);
a[i][j]=-1;
sum--;
}//右列-向上
i++;
while(a[i][--j]!=-1 && j>0){
printf("%d ",a[i][j]);
a[i][j]=-1;
sum--;
}//顶行-向右
j++;
}
return 0;
}
调试
后期修改
前面是没有严谨的写的代码,有很多不足之处,下面是修改的几处。
1.数组的长度应该是常量,不应该拿变量来做长度;
int m,n;
scanf("%d%d",&m,&n);
int a[m][n],i,j;
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
scanf("%d",a[i][j]);
}
}
//这样的写法是错误的,修要修改
#define MAXN 100
int a[MAXN][MAXN];
int m,n;
scanf("%d%d",&m,&n);
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
scanf("%d",a[i][j]);
}
}
2.输出末位不能有空格问题的修改
int first = 1;
if(first) first = 0;else printf(" ");
printf("%d",a[i][j]);
3.当把数组换成这样定义后,就会发现,第二重循环里面是有错误的,循环会溢出,不信读者可以试试,
下面是改过的代码
#include<stdio.h>
#include <string.h>
#define MAXN 10
int a[MAXN][MAXN];
int main(){
int m,n,x,y,tot,first = 1;
memset(a,-1,sizeof(a));
scanf("%d%d",&m,&n);
for(x = 0; x < m; x++){
for(y = 0; y < n; y++){
scanf("%d",&a[x][y]);
}
}
for(x = 0; x < m; x++){
for(y = 0; y < n; y++){
printf("%d ",a[x][y]);
}
}
printf("\n");
x=-1;y=0;
tot = m*n;
while(tot){
while(x<m && a[++x][y]!=-1){
if(first) first = 0;
else printf(" ");
printf("%d",a[x][y]);
// printf("%d ",a[x][y]);
a[x][y]=-1;
tot--;
}
x--;
while(y<n && a[x][++y]!=-1){
if(first) first = 0;else printf(" ");
printf("%d",a[x][y]);
// printf("%d ",a[x][y]);
a[x][y]=-1;
tot--;
}
y--;
while(x>0 && a[--x][y]!=-1){
if(first) first = 0;
else printf(" ");
printf("%d",a[x][y]);
// if(first==1) printf("%d",a[x][y]); 错误借鉴
// else {
// printf(" ");
// printf("%d",a[x][y]);
// first=0;
// }
// printf("%d ",a[x][y]);
a[x][y]=-1;
tot--;
}
x++;
while(y>0 && a[x][--y]!=-1){
if(first) first = 0;
else printf(" ");
printf("%d",a[x][y]);
// printf("%d ",a[x][y]);
a[x][y]=-1;
tot--;
}
y++;
}
return 0;
}
4.当然里边加了个函数,memset(a,0,sizeof(a));的作用是把数组a清零,在string.h中定义。
void *memset(void *s, int c, unsigned long n);
函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void*
型的指针变量,所以它可以为任何类型的数据进行初始化。