问题:5 回形取数
问题描述:
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入说明 :
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出说明 :
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
输入范例 :
4 3
1 2 3
4 5 6
7 8 9
10 11 12
输出范例 :
1 4 7 10 11 12 9 6 3 2 5 8
思路:
定义一个方向变量,根据规律进行到一定次数后改变方向,再根据方向判定接下来往哪里走
invalid用来判定和设置那些已经被读取过的位置,一开始invalid设置的是0,结果测试用例有一个不对,感觉可能是带有0又改成了-1才对。
属于是笨方法了,前面的螺旋方阵等题我都是这个思路处理的,有好方法的佬烦请赐教一下。
代码实现:
#include<bits/stdc++.h>
using namespace std;
enum Direction
{
DOWN,
RIGHT,
UP,
LEFT
};
Direction ChangeDirection(Direction dir)
{
return Direction((dir+1)%4);
}
int main()
{
int m,n;
cin>>m>>n;
int **arr=new int*[m];
for(int i=0;i<m;i++)
{
arr[i]=new int[n];
for(int j=0;j<n;j++)
{
cin>>arr[i][j];
//arr[i][j]=i*n+j+1;
}
}
Direction dir=DOWN;
int row=-1,cow=0;
int counter=0;
int invalid=-1;
while(++counter<=m*n)
{
if(counter!=1)
cout<<" ";
if(dir==DOWN)
{
row++;
cout<<arr[row][cow];
arr[row][cow]=invalid;
if(row>=m-1 || arr[row+1][cow]==invalid)
dir = ChangeDirection(dir);
}
else if(dir==RIGHT)
{
cow++;
cout<<arr[row][cow];
arr[row][cow]=invalid;
if(cow>=n-1 || arr[row][cow+1]==invalid)
dir = ChangeDirection(dir);
}
else if(dir==UP)
{
row--;
cout<<arr[row][cow];
arr[row][cow]=invalid;
if(row<=0 || arr[row-1][cow]==invalid)
dir = ChangeDirection(dir);
}
else
{
cow--;
cout<<arr[row][cow];
arr[row][cow]=invalid;
if(cow<=0 || arr[row][cow-1]==invalid)
dir = ChangeDirection(dir);
}
//cout<<"\n"<<"count:"<<counter<<endl;
}
}