黄金回旋回转寿司(顺时针与逆时针打印矩阵)

顺时针与逆时针打印矩阵

首先要搞明白,我们前四次操作分别做了上面,又会带来什么后果

顺时针

  • 第一步操作,当我们把第一排数据吃掉时,我们的行的索引就会增加一行,因为我们已经不会再回到第一行了,且高度也会减少一行。
  • 第二步操作,我们会把最后一列除开第一行第一行最后一个列吃掉,此时我们的宽度就会减少一列,但是我们的列索引不会改变,因为我们要还用
  • 第三步操作,我们会把最后一列吃掉,此时高度发生变化,其他不变
  • 第四步,把第一列吃掉,此时宽度缩小,列索引增加。
顺时针
        public static int[] Peal(int[][] m)
        {
            if(m==null) return new int[0];
            int sr=0; //行索引
            int sc=0; //列索引
            int h=m.Length; //矩阵高度,控制行索引的
            int w=m[0].Length; //矩阵宽度,控制列索引
            int[] result=new int[h*w];
            int p=0; //新建数组索引
            while(true)
            {
                if(h==0||w==0) break;
                for(int column=sc;column<sc+w;column++)
                {
                    result[p++]=m[sr][column];
                }
                sr+=1;
                h-=1;
                if(h==0||w==0) break;
                for(int row=sr;row<sr+h;row++)
                {
                    result[p++]=m[row][sc+w-1];
                }
                w-=1;
                if(h==0||w==0) break;
                for(int column=sc+w-1;column>=sc;column--)
                {
                    result[p++]=m[sr+h-1][column];
                }
                h-=1;
                if(h==0||w==0) break;
                for(int row=sr+h-1;row>=sr;row--)
                {
                    result[p++]=m[row][sc];
                }
                w-=1;
                sc+=1;
            }
            return result;
        } 

逆时针

  • 第一步把第一列吃掉,列索引增加,宽度缩小
  • 第二步把最后一行吃掉,高度减少
  • 第三步把最后一列吃掉,宽度发生变化
  • 第四步把第一行吃掉,高度减少,且行索引增加
逆时针
        public static int[] AntiPeal(int[][] m)
        {
            if(m==null) return new int[0];
            int sr=0;  
            int sc=0;   
            int h=m.Length;
            int w=m[0].Length;
            int[] result=new int[h*w];
            int p=0;
            while(true)
            {
                if(h==0||w==0) break;
                for(int row=sr;row<sr+h;row++)
                {
                    result[p++]=m[row][sc];
                }
                w-=1;
                sc+=1;
                if(h==0||w==0) break;
                for(int column=sc;column<sc+w;column++)
                {
                    result[p++]=m[sr+h-1][column];
                }
                h-=1;
                if(h==0||w==0) break;
                for(int row=sr+h-1;row>=sr;row--)
                {
                    result[p++]=m[row][sc+w-1];
                }
                w-=1;
                if(h==0||w==0) break;
                for(int column=sc+w-1;column>=sc;column--)
                {
                    result[p++]=m[sr][column];
                }
                sr+=1;
                h-=1;
            }
            return result;
        }
主方法体
    static void Main(string[] arg)
    {
        int[][] a=new int[][]
        {
            new int[]{1,2,3,4,5,7},
            new int[]{12,13,14,15,6,7},
            new int[]{11,10,9,8,7,7}
        };
        // System.Console.WriteLine(a.Length);
        // System.Console.WriteLine(a[0].Length);
        //顺时针
        var result=Apple.Peal(a);
        System.Console.WriteLine(string.Join("->",result));

        //逆时针
        // var result=AntiApple.AntiPeal(a);
        // System.Console.WriteLine(string.Join("->",result));
    }
posted @ 2022-02-14 16:11  Ariaaaaa  阅读(15)  评论(0)    收藏  举报