2

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

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:这不是功课,我正在为面试而复习我的技能。请放轻松,我是终身学习者!谢谢!我会感谢你的帮助。

4

3 回答 3

1

在这个问题中有关于这个的讨论,你可以在那里看到很多答案。

我的答案就是这个

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

q那是因为尽管高度 ( ) 是 1,但您是从右到左打印(第三个内部 for 循环) 。这是一个错误,因为如果高度为 1,则该行将由第一个内部 for 循环打印。因此,仅当高度大于 1 时才需要打印条件。第四个内部 for 循环也是如此。

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--;
        }
    }
}
于 2013-10-30T03:00:12.860 回答
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.
于 2014-12-06T11:19:34.053 回答
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;
    }
于 2017-03-18T20:53:50.553 回答