输入第一行是两个数字,分别代表行数M和列数N;接下来是M行,每行N个数字,表示这个矩阵的所有元素;当读到M=-1,N=-1时,输入终止。
请按逗号分割顺时针打印矩阵元素(注意最后一个元素末尾不要有逗号!例如输出“1,2,3”,而不是“1,2,
3,”),每个矩阵输出完成后记得换行
3 3 1 2 3 4 5 6 7 8 9 -1 -1
1,2,3,6,9,8,7,4,5
M,N为正整数且 M*N<=300000
//此为一个笨办法 //先以(优先级:右下左上)运动; //然后打一个补丁:当运动到一个方向时,优先按照该方向运动 //(笑) import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { static StringBuilder pt = new StringBuilder(); public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int m = in.nextInt(); int n = in.nextInt(); if (m == -1 && n == -1) { break; } //存储 int[][] num = new int[m][n]; for (int i = 0 ; i < m ; i++) { for (int j = 0 ; j < n ; j++) { num[i][j] = in.nextInt(); } } //当前要输出的坐标 int x = 0, y = 0; //adws,控制方向 char direction = 'd'; do { pt.append(num[x][y]); num[x][y] = -1; //优先沿袭之前的方向 if ('d' == direction || 'a' == direction){ int size = fixLeftRight(num, x, y, m, n); if (size == 0){ }else{ y += size; continue; } }else{ int size = fixUpDown(num, x, y, m, n); if (size == 0){ }else{ x += size; continue; } } //开始转向 //将-1作为结束标志,输出后数据转为-1 if (y + 1 != n && num[x][y + 1] != -1) { y++;direction = 'd'; pt.append(","); } else if (x + 1 != m && num[x + 1][y] != -1 ) { x++;direction = 's'; pt.append(","); } else if (y != 0 && num[x][y - 1] != -1) { y--;direction = 'a'; pt.append(","); } else if (x != 0 && num[x - 1][y] != -1) { x--;direction = 'w'; pt.append(","); } else { System.out.println(pt.toString()); pt = new StringBuilder(); break; } } while (true); } } public static int fixUpDown(int[][] num, int x, int y, int m, int n) { if (x + 1 != m && num[x + 1][y] != -1 ) { pt.append(","); return 1; } if (x != 0 && num[x - 1][y] != -1) { pt.append(","); return -1; } return 0; } public static int fixLeftRight(int[][] num, int x, int y, int m, int n) { if (y + 1 != n && num[x][y + 1] != -1) { pt.append(","); return 1; } if (y != 0 && num[x][y - 1] != -1) { pt.append(","); return -1; } return 0; } }
/* offer原题: https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking */ import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(br.ready()) { String[] s = br.readLine().split(" "); int m = Integer.parseInt(s[0]); int n = Integer.parseInt(s[1]); if(m == -1 && n == -1) break; int[][] matrix = new int[m][n]; for(int i = 0; i < m; i++) { String[] temp = br.readLine().split(" "); for(int j = 0; j < n; j++) matrix[i][j] = Integer.parseInt(temp[j]); } printMatrix(matrix, m, n); } } public static void printMatrix(int[][] matrix,int row,int col) { //创建StringBuffer存储,因为有,号 StringBuilder sb = new StringBuilder(); if(matrix==null || row == 0 || col == 0)return; //记录圈数 int start = 0; //其他人的方法 start = (Math.min(col,row)-1)/2+1;//确定需要的层数 for(int i = 0;i < start;i++){ //从左到右打印 for(int k = i;k<col-i;k++) sb.append(matrix[i][k]+",");; //从右上到右下 for(int j=i+1;j<row-i;j++) sb.append(matrix[j][col-i-1] + ","); //从右到左 for(int k=col-i-2;(k>=i)&&(row-i-1!=i);k--) sb.append(matrix[row-i-1][k] + ","); //从左下到左上 for(int j=row-i-2;(j>i)&&(col-i-1!=i);j--) sb.append(matrix[j][i] + ","); } //输出,记得去掉最后一个“,” System.out.println(sb.substring(0,sb.length()-1)); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * @Author: coderjjp * @Date: 2020-05-07 15:02 * @Description: * @version: 1.0 */ public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; while (!(str = br.readLine()).equals("-1 -1")){ String[] s = str.split(" "); int m = Integer.valueOf(s[0]); int n = Integer.valueOf(s[1]); int arr[][] = new int[m][n]; for (int i = 0; i < m; i++){ s = br.readLine().split(" "); for (int j = 0; j < n; j++) arr[i][j] = Integer.valueOf(s[j]); } int l=0, r=n-1, t=0, b=m-1; StringBuilder sb = new StringBuilder(); while (l<=r && t<=b){ for (int i=l;i<=r;i++) sb.append(arr[t][i]).append(","); t++; if (t>b) break; for (int i=t;i<=b;i++) sb.append(arr[i][r]).append(","); r--; if (l>r) break; for (int i=r;i>=l;i--) sb.append(arr[b][i]).append(","); b--; if (t>b) break; for (int i=b;i>=t;i--) sb.append(arr[i][l]).append(","); l++; if (l>r) break; } System.out.println(sb.deleteCharAt(sb.length()-1)); } } }
//Java AC 100% import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(br.ready()) { String[] s = br.readLine().split(" "); int m = Integer.parseInt(s[0]); int n = Integer.parseInt(s[1]); if(m == -1 && n == -1) break; int[][] matrix = new int[m][n]; for(int i = 0; i < m; i++) { String[] temp = br.readLine().split(" "); for(int j = 0; j < n; j++) matrix[i][j] = Integer.parseInt(temp[j]); } printMatrix(matrix, m, n); } } private static void printMatrix(int[][] mat, int rows, int cols) { if(mat == null || rows == 0 || cols == 0) return; StringBuilder sb = new StringBuilder(); int min = Math.min(rows, cols); for(int s = 0; 2*s < min; s++) { int endRow = rows-1-s; int endCol = cols-1-s; for(int j = s; j <= endCol; j++) //直接打印第一行 sb.append(mat[s][j]+","); if(endRow > s) { //存在第二行的条件 for(int i = s+1; i <= endRow; i++) sb.append(mat[i][endCol]+","); if(endCol > s) { //存在第三行的条件 for(int j = endCol-1; j >= s; j--) sb.append(mat[endRow][j]+","); if(endRow > s+1) { //存在第四行的条件 for(int i = endRow-1; i > s; i--) sb.append(mat[i][s]+","); } } } } //打印 System.out.println(sb.substring(0,sb.length()-1)); } }