A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 怀念子龙 中级黑马   /  2015-4-11 10:35  /  401 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2.          * 螺旋矩阵的打印问题 (首先声明是自己解决,没百度,不知网上有什么好的方法)
  3.          * 矩阵n*n
  4.          * 关于螺旋矩阵的形成我们可以这样看:
  5.          * 首先第一行打印的是 1到n总共n个数,将这算作是第一步;
  6.          * 然后再行变而列不变 打印n-1个数,然后再行不变列变打印n-1个数,这算作是第二步;
  7.          * 后面的过程只是将n-1改为n-2 ..... 一直到1.总共n步。
  8.          * 可以验证 n*n= n+2(n-1)+2(n-2)+...+2*1.
  9.          *
  10.          * 关于第一步很好实现,第二步一直到第n步这每一步我们可以观察到数字打印的过程总是 先下后左 和先上后右。  
  11.          * 如果前面一步是先下后左,下面一步就肯定是先上后右,同理也是一样。可以设置一个布尔值flag来记录这一过程。
  12.          *
  13.          */
  14.         void fun(int n)
  15.         {
  16.                 //用二维数组来存储
  17.                 int[][] arr=new int[n][n];
  18.                 int x=1;//打印的值从1开始 到n*n。
  19.                 int a=0,b=n-1; //a,b记录每一步完成之后最后打印的数据所处二维数组的位置。
  20.                 //标志第二步到第n步每一步的数据变化过程。先下后左为真,先上后右为假。
  21.                 boolean flag=true;
  22.                 //写入第一行。第一步
  23.                 for(int i=0;i<n;i++)
  24.                 {
  25.                         arr[0][i]=x++;
  26.             }
  27.                
  28.                 //第二步到第 n步。
  29.                 for(int k=n-1;k>=1;k--)
  30.                 {
  31.        
  32.                         //先下后左
  33.                         if(flag)
  34.                         {
  35.                                 //写入列。
  36.                                 for(int p=1;p<=k;p++)
  37.                                 {
  38.                                         arr[a+p][b]=x++;
  39.                                 }
  40.                                 a=a+k;
  41.                                 //写入行
  42.                                 for(int q=1;q<=k;q++)
  43.                                 {
  44.                                         arr[a][b-q]=x++;
  45.                                 }
  46.                                 b=b-k;
  47.                         }
  48.                         //先上后右
  49.                         else
  50.                         {
  51.                                 for(int p=1;p<=k;p++)
  52.                                 {
  53.                                         arr[a-p][b]=x++;
  54.                                 }
  55.                                 a=a-k;
  56.                                 for(int q=1;q<=k;q++)
  57.                                 {
  58.                                         arr[a][b+q]=x++;
  59.                                 }
  60.                                 b=b+k;
  61.                         }
  62.                         flag=!flag;
  63.                 }
  64.                
  65.                 //打印二维数组
  66.                 for(int i=0;i<n;i++)
  67.                 {
  68.                         for(int j=0;j<n;j++)
  69.                         {
  70.                                 System.out.print(arr[i][j]+"\t");
  71.                         }
  72.                         System.out.println();
  73.                 }
  74.         }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马