- /*
- * 螺旋矩阵的打印问题 (首先声明是自己解决,没百度,不知网上有什么好的方法)
- * 矩阵n*n
- * 关于螺旋矩阵的形成我们可以这样看:
- * 首先第一行打印的是 1到n总共n个数,将这算作是第一步;
- * 然后再行变而列不变 打印n-1个数,然后再行不变列变打印n-1个数,这算作是第二步;
- * 后面的过程只是将n-1改为n-2 ..... 一直到1.总共n步。
- * 可以验证 n*n= n+2(n-1)+2(n-2)+...+2*1.
- *
- * 关于第一步很好实现,第二步一直到第n步这每一步我们可以观察到数字打印的过程总是 先下后左 和先上后右。
- * 如果前面一步是先下后左,下面一步就肯定是先上后右,同理也是一样。可以设置一个布尔值flag来记录这一过程。
- *
- */
- void fun(int n)
- {
- //用二维数组来存储
- int[][] arr=new int[n][n];
- int x=1;//打印的值从1开始 到n*n。
- int a=0,b=n-1; //a,b记录每一步完成之后最后打印的数据所处二维数组的位置。
- //标志第二步到第n步每一步的数据变化过程。先下后左为真,先上后右为假。
- boolean flag=true;
- //写入第一行。第一步
- for(int i=0;i<n;i++)
- {
- arr[0][i]=x++;
- }
-
- //第二步到第 n步。
- for(int k=n-1;k>=1;k--)
- {
-
- //先下后左
- if(flag)
- {
- //写入列。
- for(int p=1;p<=k;p++)
- {
- arr[a+p][b]=x++;
- }
- a=a+k;
- //写入行
- for(int q=1;q<=k;q++)
- {
- arr[a][b-q]=x++;
- }
- b=b-k;
- }
- //先上后右
- else
- {
- for(int p=1;p<=k;p++)
- {
- arr[a-p][b]=x++;
- }
- a=a-k;
- for(int q=1;q<=k;q++)
- {
- arr[a][b+q]=x++;
- }
- b=b+k;
- }
- flag=!flag;
- }
-
- //打印二维数组
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<n;j++)
- {
- System.out.print(arr[i][j]+"\t");
- }
- System.out.println();
- }
- }
复制代码 |
|