回形取数蓝桥杯C语言

回形取数 蓝桥杯 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*
型的指针变量,所以它可以为任何类型的数据进行初始化。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值