题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int a[N][N];
bool visit[N][N];
int base[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,m;
bool judge(int row,int col){
if(row<0||col<0)return false;
if(row>=m||col>=n) return false;
if(visit[row][col]==true)return false;
return true;
}
int main(){
cin>>m>>n;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
int index=0,row=0,col=0;
int x=base[index][0],y=base[index][1];
while(1){
visit[row][col]=true;
if(row==0&&col==0)
cout<<a[row][col];
else cout<<" "<<a[row][col];
if(judge(row+x,col+y)){
row=row+x;
col=col+y;
}
else{
int num=index;
bool flag=false;
while(1){
index=(++index)%4;
x=base[index][0];
y=base[index][1];
if(judge(row+x,col+y)){
row=row+x;
col=col+y;
break;
}
if(index==num){
flag=true;
break;
}
}
if(flag) break;
}
}
return 0;
}