0
点赞
收藏
分享

微信扫一扫

回形取数(c语言)

左小米z 2022-03-10 阅读 79

【问题描述】

回形取数就是沿矩阵的边取数,诺当前方向上无数可取或已经取过,则左转90°。一开始位于矩阵左上角,方向向下。

【输入格式】

输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列,接下来m行每行n个整数,表示这个矩阵

【输出格式】

输出只有一行,共mn个数,为输出矩阵回形取数得到的结果,数之间用一个空格分离,行末不要有多余的空格。

【样例输入】

3 3

1 2 3

4 5 6

7 8 9

【样例输出】

1 4 7 8 9 6 3 2 5

【样例输入】

3 2

【样例输出】

1 2

3 4

5 6

【分析】

题目中的回形取数说白了就是起点为arr【0】【0】逆时针取数。

因为题目要求行末不要有多余的空格,所以我们先输出arr【0】【0】(arr为输入数组的名字)

输出该数的时候前后不要有空格,然后输出后面的数时,在前面加一个空格就好了,这样行末就不会有空格了。

设输出的数个数为sign=1,因为已经输出一个数了,sign等于几就代表输出几个数了,那么输出的终止条件就是sign<m*n;

我们把它取数时分为四个区间,依次是   左,下,右,上

我们可以定义一个变量k初始值设置为1,每输出一行或一列的时候k++;

所以k%4=1就代表第一区间,k%4=2就代表第二区间,k%4=3就代表第三区间,k%4=0就代表第四区间。

i代表行,j代表列

第一区间:i++

第二区间:j++

第三区间:i--

第四区间:j--

我们可以观察到:

下影响左,也就是说下面每输出一行,左边输出的终止条件就减一

同理,右影响下;上影响右;左影响上;

所以我们就给每个区间分别定义一个变量(l,t,r,t)(英文单词首字母)来实现这些终止条件

具体可以看代码

#include<stdio.h>
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	int arr[200][200];
	int i,j;
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%d",&arr[i][j]);        //输入格式
		}
	}
	i=0,j=0;
	printf("%d",arr[i][j]);
	int k=1,sign=1;		//k代表位置,sign代表输出个数 
	int t=0,b=0,l=0,r=0;
	while(sign<(m*n)){
		if((k%4==1)&&((i+1)<(m-b))){
			i++;
			printf(" %d",arr[i][j]);
			sign++;
			continue;         //每输出一个数,用continue来截止本次循环,因为在拐弯处会输出两个数字(本行或列的最后一个数字和下一行或列的第一个数字)
		}
		if((k%4==1)&&((i+1)==(m-b))){
			l++;
			k++;
		}
		if((k%4==2)&&((j+1)<(n-r))){
			j++;
			printf(" %d",arr[i][j]);
			sign++;
			continue; 
		}
		if((k%4==2)&&((j+1)==(n-r))){
			b++;
			k++;
		}
		if((k%4==3)&&((i-1)>=t)){
			i--;
			printf(" %d",arr[i][j]);
			sign++;
			continue; 
		}
		if((k%4==3)&&((i-1)==(t-1))){
			r++;
			k++;
		}
		if((k%4==0)&&((j-1)>=l)){
			j--;
			printf(" %d",arr[i][j]);
			sign++;
			continue; 
		}
		if((k%4==0)&&((j-1)==(l-1))){
			t++;
			k++;
		}
	}
	return 0;
}
举报

相关推荐

0 条评论