一,问题描述
1,给定一个数n,以螺旋顺序产生一个具有n*n个元素的正方形矩阵。
2,格式如下:
输入: 3
输出: [1 2 3]
[8 9 4]
[7 6 5]
输入:4
输出:[1 2 3 4]
[12 13 14 5]
[11 16 15 6]
[10 9 8 7].
3,解题思路:
第一, 这题的解题思路和第54题(spiral matrix)是相似的,这两题可以结合一起做的。
第二 ,这题的思路如下:
首先,一次循环如下:把数组的第一行从左到后赋值递增的数(1,2,…),然后再把数组最后一列从上到下赋值递增的数,然后再把数组的最后一行,从右到左赋值递增的数。最后把数组的第一列从下到上赋值递增的数。这是一次循环。然后行减去2行(就是第一行和最后一行),列减去2列(就是第一列和最后一列),继续上述的循环操作。直到赋值的数大于n*n。
二,AC了的程序(用Java实现的)
import java.util.*;
public class Test2{
public int[][] generateMatrix(int n)
{
List<Integer> list=new ArrayList<Integer>();
int [][]data=new int[n][n];
if(n==0)
{
return data;
}
int hang=n; //表示行
int lie=n; //表示列
int temp=1;
for(int i=0,j=0;i<hang&&j<lie;i++,j++)
{
//每一次循环完后,i和j各加1
for(int linlie=j;linlie<hang;linlie++) //当n=3时, 把数组的第一行从左到有存入1,2,3
{
data[i][linlie]=temp;
// System.out.println("data[+"+i+"][+"+linlie+"]="+data[i][linlie]);
temp++;
}
for(int linhang=i+1;linhang<lie;linhang++) //把数组的最后一列从上到下存入 4,5
{
data[linhang][hang-1]=temp;
temp++;
}
for(int linlie=hang-2;linlie>=j&&i!=(hang-1);linlie--) //把数组的最后一行从右到左存入,6 7
{
data[hang-1][linlie]=temp;
temp++;
}
for(int linhang=lie-2;linhang>i&&j!=(lie-1);linhang--) //把数组的第一列,从下到上依次存入,8,(因为1已经存过
{
data[linhang][j]=temp;
temp++;
}
hang--; //然后行减去一
lie--; //列减去一,
if(temp>n*n)
{
break;
}
}
return data;
}
public static void main(String []args)
{
Test2 test=new Test2();
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int [][]result=test.generateMatrix(n);
for(int i=0;i<result.length;i++)
{
for(int j=0;j<result[i].length;j++)
{
System.out.print(result[i][j]+" ");
}
System.out.println();
}
System.out.println();
}
}
运行结果: