今天写了java旋转矩阵,参考了下网上的代码。
旋转矩阵思路比较简单,其实就是按照人的思维方法(可能有更优解,但是我比较笨)
其实就是一个数组,先从左到右,然后从上到下,然后从右到左,最后从下到上,循坏一周后减二接着循环,直到最大值到达n*n
代码如下:
package news;
import java.util.Scanner;
public class luoxuan {
public static final int NMAX = 100;
public static void main(String [] arg){
/*
* 编程输出螺旋方阵.
螺旋方阵是指将从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。如4阶的螺旋方阵形式如下:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
要求:1)从键盘输入螺旋方阵的阶数
2)代码有注释
3)对算法的思路给出文字描述
*/
System.out.println("请输入螺旋矩阵阶数:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[][] arrays=new int[NMAX][NMAX];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
arrays[i][j] = 0;
System.out.println("从矩阵的左上角开始从数字1开始螺旋:");
getluoxuan1(arrays,n);
display(arrays,n);
System.out.println();
System.out.println("从矩阵的右上角开始从数字1开始螺旋:");
getluoxuan2(arrays,n);
display(arrays,n);
System.out.println();
System.out.println("从矩阵的左上角开始从数字的最大值开始螺旋:");
getluoxuan11(arrays,n);
display(arrays,n);
System.out.println();
System.out.println("从矩阵的右上角开始从矩阵的最大值开始螺旋:");
getluoxuan22(arrays,n);
display(arrays,n);
}
private static void display(int[][] arrays, int n) {
// TODO Auto-generated method stub
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
System.out.printf("%5d",arrays[i][j]);
System.out.println();
}
}
//核心算法:
private static void getluoxuan1(int [][]arrays,int n){
// System.out.println("从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:");
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++) //从左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j--;j>=c;j--)//从右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou++;
}
c++;
}
}
private static void getluoxuan11(int [][]arrays,int n)
{
// System.out.println("从矩阵的左上角开始从数字的最大值开始螺旋");
int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++) //从左到右
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j--;j>=c;j--)//从右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou--;
}
c++;
}
}
private static void getluoxuan2(int [][]arrays,int n)
{
// System.out.println("从矩阵的右上角开始从数字1开始螺旋:");
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{
i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--) //从右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j++;j<n-c;j++)//从左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou++;
}
c++;
}
}
static void getluoxuan22(int [][]arrays,int n)
{
// System.out.println("从矩阵的右上角开始从矩阵的最大值开始螺旋:");
int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{
i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--) //从右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i++;i<n-c;i++) // 从上到下
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j++;j<n-c;j++)//从左到右
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i--;i>=c+1;i--)//从下到上
{
if(ou>z) break;
arrays[i][j] = ou--;
}
c++;
}
}
}