您的位置:首页 > 其它

11--回形取数

2018-03-18 15:33 155 查看
 基础练习 回形取数  时间限制:1.0s   内存限制:512.0MB      锦囊1循环,标记。锦囊2使用多次循环来处理,也可以对取过的数标记来简化循环的判断。问题描述  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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样例输出1 3 5 6 4 2此处我利用递归的方法去做。递归的限制条件(跳出条件)有三个:①:当元素取完是结束递归②:当只有或只剩一行时,直接按照顺序输出数组的元素③:当只有或只剩一列时,直接按照顺序输出数组的元素
代码展示:#include<iostream>
#include<stdio.h>
using namespace std;

int Qu(int a[][200] , int h , int l){

int b[200][200];
//条件1
if(h == 0&& l == 0)
return 0;
//条件2
if(h == 1&& l > 0){
for(int i = 0;i < l;i++)
printf("%d ", a[0][i]);
return 0;
}
//条件3
if(l == 1&&h > 0){
for(int i = 0;i < h;i++)
printf("%d ", a[i][0]);
return 0;
}

for(int i = 0;i < h;i++ )
printf("%d ",a[i][0]);
//向右旋转90度
for(int i = 1;i < l;i++)
for(int j = 0;j < h;j++){
b[i-1][j] = a[h-j-1][i];
}

Qu(b , l-1 , h);
}

int main(){
int m,n;//行、列
scanf("%d%d", &m,&n);
int arr[200][200];
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
scanf("%d",&arr[i][j]);
}
}
Qu(arr , m ,n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  回形取数