基础练习 回形取数 (循环 + Java 输入输出外挂)

  基础练习 回形取数  
时间限制:1.0s   内存限制:512.0MB
      
问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
 
析:看起来挺简单,只要按照它的要求输出,就可以了,主要是判断在拐弯的时候,只要前面已经出界,或者是已经走过了,就左拐,如果还走过,再左拐,总能够全部走完,但是Java 实在是太慢了,尤其是输入和输出,以至于我一直都是 90 ,后来加了一个输出外挂,才 100,由于输入外挂比输出要长,所以不爱写,但是C++ 是真的快,几乎就是 0 ms
代码如下:
import java.util.*;
import java.io.*;

public class Main{
  public static int [][]a;
  public static int []dr = {1, 0, -1, 0};
  public static int []dc = {0, 1, 0, -1};
  public static int n, m;
  public static boolean isIn(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
  }
  
  public static void main(String []args){
    Scanner cin = new Scanner(System.in);
    n = cin.nextInt();
    m = cin.nextInt();
    a = new int[n+5][m+5];
    for(int i = 0; i < n; ++i)
      for(int j = 0; j < m; ++j)
        a[i][j] = cin.nextInt();
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    out.print(a[0][0]);
    a[0][0] = -1;
    int idx = 0, r = 0, c = 0, cnt = 0;
    while(++cnt < m * n){
      while(true){
        int x = r + dr[idx];
        int y = c + dc[idx];
        if(isIn(x, y) && a[x][y] != -1){
          out.print(" " + a[x][y]);
          a[x][y] = -1;
          r = x;  c = y;
          break;
        }
        ++idx;
        if(idx >= 4)  idx -= 4;
      }
    }
    out.println();
    out.flush();
  }
}

  

原文地址:https://www.cnblogs.com/dwtfukgv/p/8596522.html