算法题-回形取数
算法题-回形取数
描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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;
}

浙公网安备 33010602011771号