算法题-回形取数

算法题-回形取数

描述

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

输入

​ 输入描述:

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

​ 输入样例:

​ 3 3

​ 1 2 3

​ 4 5 6

​ 7 8 9

输出

​ 输出描述:

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

​ 输出样例:

​ 1 4 7 8 9 6 3 2 5

思路

1.找出规律,是这类型题的重点

2.如何判断已经全部循环完结束了,可以用一个变量记录count<m*n(输出一个数,count++,count代表已经遍历过的个数;m,n分别代表矩阵的行和列)

  • 复习一个小知识点

    三目运算符:

    对于条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式绝不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。

    ? : ; "?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。

    注意:在C语言中,结果1 和 结果2的类型必须一致。

    可以用来控制行末不要有空格。

	int a[] ={1,2,3,4};
	for(int i=0;i<4;i++){
		printf(i ? " %d" : "%d",a[i]);
	}
    输出:1 2 3 4

该算法题代码如下:

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int m,n;//m代表矩阵的行,n代表矩阵的列
	int a[200][200];//用来存储矩阵 
	//读入 m,n并且读入矩阵 
	cin>>m>>n;    
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>a[i][j];
		}
	}
	int flag=0;//用来控制行末不要有空格 
	int count=0;//用来计数,遍历完一个就count++
	int circle=0;//表示遍历完几圈了 
	while(count<m*n) //通过判断count是否小于m*n即矩阵元素个数来终止遍历 ,下面每一个for循环也是需要判断 
	{
		for(int i=circle;i<=m-1-circle&&count<m*n;i++)  //第一列 
		{
			if(flag==0)
			{
				cout<<a[i][circle];
				count++;
				flag++;
			}
			else
			{
				cout<<" "<<a[i][circle];
				count++;	
			}

		}
		for(int j=circle+1;j<=n-1-circle&&count<m*n;j++) //最后一行 
		{
			cout<<" "<<a[m-1-circle][j];
			count++;
		}
		for(int k=m-2-circle;k>=circle&&count<m*n;k--) //最后一列 
		{
			cout<<" "<<a[k][n-1-circle];
			count++;
		}
		for(int h=n-2-circle;h>=circle+1&&count<m*n;h--)//第一行 
		{
			cout<<" "<<a[circle][h];
			count++;
		}
		circle++;	
	}
	return 0;
}
posted @ 2022-11-29 11:12  Qin_Yue  阅读(144)  评论(0)    收藏  举报