蓝桥杯 基础编程题 回形取数

时间限制: 1000ms 内存限制: 128MB

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

#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,data[200][200];
bool visted[200][200] = {false};
int dir[4][2] = {
{1,0},
{0,-1},
{-1,0},
{0,1}
};
bool is_ok(int row,int col){
return row >= 0 && row < n && col >= 0 && col < m && !visted[row][col] ? true : false;
}
int main(){

cin>>n>>m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++)
cin>>data[i][j];
}
int mid = n * m;
int flag = 0;
int row = 0;
int col = 0;
while(mid){
if(is_ok(row,col)){
cout<<data[row][col]<<" ";
visted[row][col] = true;
mid--;
}
if(!mid)
return 0;
while(!(is_ok(row + dir[flag][0],col + dir[flag][1]))){
flag++;
flag %= 4;
}
row = row + dir[flag][0];
col = col + dir[flag][1];

}


return 0;
}