黄金回旋回转寿司(顺时针与逆时针打印矩阵)
顺时针与逆时针打印矩阵
首先要搞明白,我们前四次操作分别做了上面,又会带来什么后果
顺时针
- 第一步操作,当我们把第一排数据吃掉时,我们的行的索引就会增加一行,因为我们已经不会再回到第一行了,且高度也会减少一行。
- 第二步操作,我们会把最后一列除开第一行第一行最后一个列吃掉,此时我们的宽度就会减少一列,但是我们的列索引不会改变,因为我们要还用
- 第三步操作,我们会把最后一列吃掉,此时高度发生变化,其他不变
- 第四步,把第一列吃掉,此时宽度缩小,列索引增加。
顺时针
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));
}