回形取数
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int a[201][201]={0};
int visted[201][201]={0};
int num=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
int direction=1;//1向下2向右3向上.......
int x=0,y=0;
int temp=0;
int first=0;
while(num!=n*m){
if(temp==0){//temp=0时可以移动一次
if(first==0)
cout<<a[x][y];
else
cout<<" "<<a[x][y];
first=1;
visted[x][y]=1;
num++;
}
else{//temp==1说明刚发生转向,下一次再走
temp=0;
}
if(direction==1&&x!=n-1&&visted[x+1][y]==0)
x++;
else if(direction==2&&y!=m-1&&visted[x][y+1]==0)
y++;
else if(direction==3&&x!=0&&visted[x-1][y]==0)
x--;
else if(direction==4&&y!=0&&visted[x][y-1]==0)
y--;
else{
temp=1;
if(direction==4)
direction=1;
else
direction++;
}//不能前进了
}
return 0;
}