【蓝桥杯】【基础练习19】【回形取数】

来源:互联网 发布:2017网络手游排行榜 编辑:程序博客网 时间:2024/04/28 08:20

题目:回形取数

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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


分析:由于运动有四个方向,我们只有确定当前所处的方向的时候才能知道下一步往哪里走
ULDR 表示上右下左四个方向,它代表了左转的次序,-1表示这个位置已经取过。



源码:

public class Test011 {private static String s = "ULDR";private static int m;private static int n;private static int[][] a ;public static void main(String[] args) {Scanner sc = new Scanner(System.in);m = sc.nextInt();n = sc.nextInt();a= new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {a[i][j] = sc.nextInt();}}sc.close();walk('D', 0, 0, m*n);}//a表示矩阵数组,o表示当前的行进的方向,x代表横坐标,y代表纵坐标,step代表剩下几个位置没有走过private static void walk(char o, int x, int y,int step){if(step == 1){ //程序结束条件System.out.println(a[x][y]);return ;}switch (o) {case 'U':if(x-1<0 ||(x-1>=0 && a[x-1][y]==-1)){o = getNext(o);walk(o, x, y, step);}else{System.out.print(a[x][y]+" ");a[x][y] = -1;walk( o, x-1, y, step-1);}break;case 'L':if(y-1<0 ||(y-1>=0 && a[x][y-1]==-1)){o = getNext(o);walk(o, x, y, step);}else{System.out.print(a[x][y]+" ");a[x][y] = -1;walk( o, x, y-1, step-1);}break;case 'D':if(x+1 == m || (x+1<m && a[x+1][y]==-1)){o = getNext(o);walk(o, x, y, step);}else{System.out.print(a[x][y]+" ");a[x][y] = -1;walk(o, x+1, y, step-1);}break;case 'R':if(y+1 == n|| (y+1<n && a[x][y+1]==-1)){o = getNext(o);walk(o, x, y, step);}else{System.out.print(a[x][y]+" ");a[x][y] = -1;walk( o, x, y+1, step-1);}break;}}//取下一方向private static char getNext(char c){int index = s.indexOf(c);index++;if(index == s.length()){index = 0;}return s.charAt(index);}


0 0
原创粉丝点击