螺旋打印mxn矩阵 - java

时间:2013-10-30 02:44:54

标签: java matrix

我试图以螺旋方式打印mxn大小的矩阵。我尝试通过Java来处理这段代码,如果rows = columns,我能够正确打印螺旋。 对于不相等的行和列,我倾向于重复打印。因此它会正确地打印到中心,然后重复一个或多个元素。我尝试过调试但无法达到远程。 谁能帮我这个? 这是我到目前为止的代码。

public class SpiralMatrix {
public static void main (String args[]){
    int[][] mat = { {1, 2,  3,  4,  5},
                    {6, 7,  8,  9,  10},
                    {11,12, 13, 14, 15}};
    int i,n=3,m=5,r=m-1,q=n-1;
    while(q>0 && r>0){
        for(i=m-1-r;i<=r;i++){
            System.out.println(mat[m-1-r][i]);
        }
        for(i=n-1-q+1;i<=q;i++){
            System.out.println(mat[i][r]);
        }
        for(i=r-1;i>=m-1-r;i--){
            System.out.println(mat[q][i]);
        }
        for(i=q-1;i>=n-1-q+1;i--){
            System.out.println(mat[i][n-1-q]);
        }
        q--;
        r--;
    }
}
}

输出如下:

1
2
3
4
5
10
15
14
13
12
11
6
7
8
9
8
7

因此在达到中间值9后,它追溯到8和7。 PS:这不是作业,我正在磨练我的采访技巧。请放轻松我,我是一个终身学习者! 谢谢!我将非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

this question中对此进行了讨论,你可以在那里看到很多答案。

我的答案是this one

似乎你只是打印太多了,它似乎来自第三个内部for循环(在其他情况下,当高度超过宽度时,可能来自第四个for循环)。

那是因为你是从右到左(第三个内圈for循环)打印,尽管高度(q)是一个。这是一个错误,因为如果高度为1,那条线将由第一个内部for循环打印。因此,只有在高度大于1时才需要打印条件。第四个内部循环就是这种情况。

public class SpiralMatrix {
    public static void main (String args[]){
        int[][] mat = { {1, 2,  3,  4,  5},
                        {6, 7,  8,  9,  10},
                        {11,12, 13, 14, 15}};
        int i,n=3,m=5,r=m-1,q=n-1;
        while(q>0 && r>0){
            for(i=m-1-r;i<=r;i++){
                System.out.println(mat[m-1-r][i]);
            }
            for(i=n-1-q+1;i<=q;i++){
                System.out.println(mat[i][r]);
            }
            for(i=r-1;i>=m-1-r && q>1;i--){
                System.out.println(mat[q][i]);
            }
            for(i=q-1;i>=n-1-q+1 && r>1;i--){
                System.out.println(mat[i][n-1-q]);
            }
            q--;
            r--;
        }
    }
}

答案 1 :(得分:0)

public class SpiralMatrix {
    public static void main(String[] args) {
        int a[][] = {{1, 2, 3, 4,21,26},
                {5, 6, 7, 8,22,27},
                {9, 10, 11, 12,23,28},
                {13,14,15,16,24,29},
                {17,18,19,20,25,30},
                {31,32,33,34,35,36}};
        System.out.println(a[0].length);
        for(int i=0; i<6; i++) {
            for(int j=0;j<6;j++){
                System.out.print(a[i][j] + " , ");
            }
            System.out.println();
        }
        int m=6,n=6;

        for (int i=0;i<m;i++) { 
            int j=i;
            for(;j<n;j++){
                System.out.print(a[i][j] + " , ");
            }

            for(j=i+1;j<m;j++) {
                System.out.print(a[j][n-1] +" , ");
            }
            for(j=n-2;j>=i;j--){
                System.out.print(a[m-1][j] + " , ");
            }
            for(j=m-2;j>i;j--){
                System.out.print(a[j][i] + " , ");
            }
            m=m-1;
            n=n-1;          
        }
    }

}
//tried to simplfy the code to print a square matrix spiral way.
//complete code given, please post if feel any modification required.

答案 2 :(得分:0)

每次机器人转动90度时你需要一个if条件!

    public static Stack<int> SpiralTraverse(int[,] arr)
    {
        Stack<int> trav = new Stack<int>();
        int m = arr.GetLength(0)-1; //end point (m,n)
        int n = arr.GetLength(1)-1;
        int k = 0; int l = 0; // starting point (k,l)
        int i; //index
        while( k <= m && l <= n)
        {
            for (i= l; i <= n; i++)
            {
                trav.Push((int)arr[k, i]);
            }
            k++;
            for (i = k; i <= m; i++)
            {
                trav.Push((int)arr[i, n]);
            }
            n--;
            if (k < m)
            {
                for (i= n;i>= l; i--)
                {
                    trav.Push((int)arr[m,i]);
                }
                m--;
            }
            if (l < n)
            {
                for (i= m;i>= k; i--)
                {
                    trav.Push((int)arr[i, l]);
                }
                l++;
            }
        }
        return trav;
    }