java旋转矩阵

今天写了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++;


 	}
 	}

 

 	

    	
}


猜你喜欢

转载自blog.csdn.net/CSDN_laoganma_com/article/details/79582682