首页 > 试题广场 >

顺时针打印数字矩阵

[编程题]顺时针打印数字矩阵
  • 热度指数:4488 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个数字矩阵,请设计一个算法从左上角开始顺时针打印矩阵元素

输入描述:
输入第一行是两个数字,分别代表行数M和列数N;接下来是M行,每行N个数字,表示这个矩阵的所有元素;当读到M=-1,N=-1时,输入终止。


输出描述:
请按逗号分割顺时针打印矩阵元素(注意最后一个元素末尾不要有逗号!例如输出“1,2,3”,而不是“1,2,
3,”),每个矩阵输出完成后记得换行
示例1

输入

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;
    }
}

发表于 2023-11-22 12:00:37 回复(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));
    }
}

发表于 2020-05-24 12:19:28 回复(0)
四个指针,剑指offer原题
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));
        }
    }
}


发表于 2020-05-07 15:24:03 回复(0)
//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));
    }
}

编辑于 2019-08-19 17:04:27 回复(0)

热门推荐

通过挑战的用户

查看代码