螺旋矩阵打印的结束条件应该是什么?

时间:2015-08-12 12:12:15

标签: java matrix spiral

我已编写代码以螺旋形式打印矩阵。

我对我的遍历是正确的,但是我无法想出矩阵中层数的结束条件。

请参阅下面的代码

当我将层数硬编码为2时,我得到了预期的输出,因为我事先知道了矩阵。如何用while循环替换while循环中的条件,以便它适用于所有矩阵。

public class IterativeSpiral
{
    public static void main(String[] args)
    {
        char[][] a = {
                {'a','b','c','d'},
                {'l','m','n','e'},
                {'k','p','o','f'},
                {'j','i','h','g'}
        };

        fun(a,4,4);
    }

    static void fun(char[][] a, int rows, int cols)
    {
        int count = 0;

        //this condition in while loop needs to be replaced
        while(count < 2)
        {
            System.out.println("Layer"+count);

            for(int i = count;i<cols-count;i++)
                System.out.print(a[count][i]);

            for(int i = count+1;i<rows-count;i++)
                System.out.print(a[i][cols-count-1]);

            for(int i = cols-count-2;i>=count;i--)
                System.out.print(a[rows-count-1][i]);

            for(int i = rows-count-2;i>count;i--)
                System.out.print(a[i][count]);

            count++;
            System.out.println("");
        }
    }
}

我尝试找到结束条件

  1. 我想到的任何结局条件,我一直在打一个反例 它不能像2 * 5(更多列)或5 * 2(更多行)那样工作 基质
  2. 我能想到的唯一结局条件是计算数量 每个for循环之后的元素,当它等于rows * cols时,从while循环中断。但是,我不想这样做。我正在寻找一个使用代码中的变量的结束条件。

1 个答案:

答案 0 :(得分:0)

当矩阵比它高时,行数决定了结束条件。当它高于它的宽度时,就是列数。

图层数将是行数或列数的一半,向上舍入。

所以终止条件是

while(count < (Math.min(rows, cols) + 1) / 2)

但是,您还需要在第3次和第4次运行的循环内添加一些额外条件,以防止输出重复元素,因为当列数或列的最小值为奇数时,不会有精确的层数:

if(count != rows-count-1)
{
    for(int i = cols-count-2;i>=count;i--)
        System.out.print(a[rows-count-1][i]);
}

if(count != cols-count-1)
{
    for(int i = rows-count-2;i>count;i--)
        System.out.print(a[i][count]);
}

当然你也可以使用其他一些终止条件,但希望这可以回答你的问题,因为你说你不想使用它们。