回形取数(c语言)

【问题描述】

回形取数就是沿矩阵的边取数,诺当前方向上无数可取或已经取过,则左转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

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

我们可以定义一个变量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
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	int arr[200][200];
	int i,j;
	for(i=0;i=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;
}

你可能感兴趣的:(c语言,开发语言,后端)