一、问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
二、输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
三、输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
四、样例输入
(1)样例输入
3 3
1 2 3
4 5 6
7 8 9
(2)样例输出
1 4 7 8 9 6 3 2 5
五、代码实现
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
//用来指示方向
int dX[4] = {1, 0, -1, 0};
int dY[4] = {0, 1, 0, -1};
int num[202][202];
int _index[202][202];//用来指示当前位置是否被搜索过
void search(long int tot)
{
int temp = 0;
int i = 1, j = 1;
int x = 0, y = 0;//先向下搜索,到头后旋转90°
while(temp < tot)
{
if(_index[i][j] == 1){
i-=dX[x]; j-=dY[y];//回到上一个点
if(x == 3) {x = 0; y = 0;}
else {x+=1; y+=1;}
i+=dX[x]; j+=dY[y];//更新x,y后搜索下一个点
continue;
}
cout<<num[i][j]<<" ";
_index[i][j] = 1;
i+=dX[x]; j+=dY[y];
temp+=1;
}
}
int main(int argc, char** argv)
{
int m, n;
cin>>m>>n;
for(int i = 0; i < 202; i++)
for(int j = 0; j < 202; j++)
_index[i][j] = 1;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
{
cin>>num[i][j];
_index[i][j] = 0;
}
search(m*n);
return 0;
}