基础练习 回形取数
时间限制:1.0s 内存限制:512.0MB
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
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 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(); } }