回形取数
Time Limit: 1 Sec
Memory Limit: 128 MB
Submit: 39
Solved: 8
[
Submit][
Status][
Web Board]
Description
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
Input
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
Output
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
Sample Input
3 3 1 2 3 4 5 6 7 8 9
Sample Output
1 4 7 8 9 6 3 2 5
HINT
请关注微信公众号onlinejudge
Source
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int f[][],vis[][];
static int n,m,ans;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n=in.nextInt();
m=in.nextInt();
f=new int[n+5][m+5];
vis=new int[n+5][m+5];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
f[i][j]=in.nextInt();
//System.out.println("*");
}
}
ans=0;
col1(-1,0);
System.out.println();
}
private static void col1(int row,int col) {
// TODO Auto-generated method stub
int i;
for( i=row+1;i<n;i++){
if(vis[i][col]==1)break;
vis[i][col]=1;
ans++;
System.out.print(f[i][col]);
if(ans<n*m)System.out.print(" ");
else return ;
}
row1(i-1,col);
}
private static void row1(int row,int col) {
// TODO Auto-generated method stub
int i;
for(i=col+1;i<m;i++){
if(vis[row][i]==1)break;
vis[row][i]=1;
ans++;
System.out.print(f[row][i]);
if(ans<n*m)System.out.print(" ");
else return ;
}
col2(row,i-1);
}
private static void col2(int row, int col) {
// TODO Auto-generated method stub
int i;
for( i=row-1;i>=0;i--){
if(vis[i][col]==1)break;
vis[i][col]=1;
ans++;
System.out.print(f[i][col]);
if(ans<n*m)System.out.print(" ");
else return;
}
row2(i+1,col);
}
private static void row2(int row, int col) {
// TODO Auto-generated method stub
int i;
for(i=col-1;i>=0;i--){
if(vis[row][i]==1)break;
vis[row][i]=1;
ans++;
System.out.print(f[row][i]);
if(ans<n*m)System.out.print(" ");
else return;
}
col1(row,i+1);
}
}