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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王新年 中级黑马   /  2013-12-7 14:50  /  1610 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

怎样编出4阶螺旋方阵,原理?
如图:
1     2       3       4
12    13     14       5
11    16     15       6
10     9       8       7



评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

4 个回复

倒序浏览
  1. package com.demo.test;

  2. public class Demo5
  3. {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args)
  8.         {
  9.                 int n=4;                          //阶数
  10.         int mat[][] = new int [n][n];
  11.         int i,j,k=0;
  12.         for (i=0;i<(n+1)/2;i++)           //i控制生成方阵的圈数,一圈内有4条边
  13.         {                                 //j控制生成一条边的数据
  14.             for (j=i;j<=n-i-1;j++)        //顶边,从左到右,行不变列变
  15.                 mat[i][j] = ++k;          //k从1递增到n*n
  16.                
  17.             for (j=i+1;j<=n-i-1;j++)      //右边,从上到下,行变列不变
  18.                 mat[j][n-i-1] = ++k;
  19.                
  20.             for (j=n-i-2;j>=i;j--)        //底边,从右到左,行不变列变
  21.                 mat[n-i-1][j] = ++k;
  22.                       
  23.             for (j=n-i-2;j>=i+1;j--)      //左边,从下到上,行变列不变
  24.                 mat[j][i] = ++k;
  25.         }
  26.         
  27.         for (i=0;i<mat.length;i++)        //输出二维数组
  28.         {
  29.             for (j=0;j<mat[i].length;j++)
  30.                 System.out.print(mat[i][j]+"\t");
  31.             System.out.println();
  32.         }

  33.         }

  34. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报
  1. import java.util.Scanner;


  2. public class Test
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         Scanner scan=new Scanner(System.in);
  7.         int n=scan.nextInt();
  8.         int[][] date=new int[n][n];
  9.         int number=1;
  10.         int xunhuan=0;//圈数
  11.         if(n/2==0)
  12.         {
  13.             xunhuan=n;//计算出循环圈数
  14.         }
  15.         else
  16.         {
  17.             xunhuan=n+1;//计算循环圈数
  18.         }
  19.         for(int m=0;m<xunhuan;m++)//矩阵的绘制
  20.         {
  21.             for(int i=m;i<n-m;i++)
  22.             {
  23.                 date[m]<i>=number;
  24.                 number++;
  25.             }
  26.             for(int i=m+1;i<n-m;i++)
  27.             {
  28.                 date<i>[n-m-1]=number;
  29.                 number++;
  30.             }
  31.             for(int i=n-m-2;i>=m;i--)
  32.             {
  33.                 date[n-m-1]<i>=number;
  34.                 number++;
  35.             }
  36.             for(int i=n-m-2;i>m;i--)
  37.             {
  38.                 date<i>[m]=number;
  39.                 number++;
  40.             }
  41.         }
  42.         
  43.         for(int i=0;i<date.length;i++)//输出
  44.         {
  45.             for(int j=0;j<date<i>.length;j++)
  46.             {
  47.                 System.out.print(date<i>[j]+"\t");
  48.             }
  49.             System.out.println("\t");
  50.         }
  51.     }

  52.     int xunhuan=n/3+1;
  53. }
复制代码
你的问题是不清楚的,如果没做过的是不懂你的意思的,
生成的矩阵是n行n列
我不是在27届回答过你吗?

评分

参与人数 1黑马币 +6 收起 理由
简★零度 + 6

查看全部评分

回复 使用道具 举报
本帖最后由 王明明 于 2013-12-7 23:59 编辑
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.              jisuan(8,7);
  6.         }        

  7.         public static void jisuan(int h,int l){//h代表行,l代表列

  8.         int mat[][] = new int [h][l];
  9.         int i,j,k=0;
  10.         for (i=0;i<(h+1)/2;i++)           //i控制生成方阵的圈数 圈数跟行有关
  11.         {                                 //j表示要输出的数
  12.              for(j=i;j<l-i;j++){       //行不变列变 h不变 l变 l控制循环
  13.                      mat[i][j] = ++k;
  14.                       }
  15.               for(j=i+1;j<h-i;j++){ //行变列不变 h变 l不变  h控制循环
  16.                       mat[j][l-i-1] = ++k;
  17.                       }
  18.               for(j=l-i-2;j>=i;j--){ //行不变列变 h不变 l变 l控制循环 j=l-i-2 最大行数l减去圈数 - 右边已经输出一列 - 数组是0下标开始再减1 所以是l-i-2
  19.                       mat[h-i-1][j] = ++k;
  20.                       }
  21.              for(j=h-i-2;j>=i+1;j--){//行变列不变 h变 l不变 h控制循环 同上 j>=i+1 在第一圈快结束的时候 第一列 已经输出了 所以要+1
  22.                       mat[j][i] = ++k;
  23.                       }
  24.         }
复制代码


评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
楼主您好,
我原来遇到过一个这种算法题,叫做“蛇形填数”,下面是我提供的代码,楼主只要改变我的代码中的n值,就可以输出不同阶数的这种矩阵!
  1. package com.day02;

  2. public class shexingtianshu {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 int n = 6;
  9.                 int[][] arr = new int[n][n];
  10.                 int cnt = 1;
  11.                 int i = 0, j = 0;
  12.                 while( cnt <= n*n )
  13.                 {
  14.                         while( (j < n) && (arr[i][j] == 0) )
  15.                                 arr[i][j++] = cnt++;
  16.                         i++;j--;
  17.                         while( (i < n) &&(arr[i][j] == 0) )
  18.                                 arr[i++][j] = cnt++;
  19.                         i--;j--;
  20.                         while( (j >= 0) && (arr[i][j] == 0) )
  21.                                 arr[i][j--] = cnt++;
  22.                         i--;j++;
  23.                         while( (i >= 0) && (arr[i][j] == 0) )
  24.                                 arr[i--][j] = cnt++;
  25.                         i++;j++;
  26.                 }
  27.                 for( int p = 0 ; p < n; p++ )
  28.                 {
  29.                         for( int q = 0; q < n; q++ )
  30.                                 System.out.printf("%5d",arr[p][q]);
  31.                         System.out.println();
  32.                 }
  33.                                

  34.         }

  35. }
复制代码

希望可以帮到您,其实这种问题的原理就是技巧型的给二维数组赋值。如果您想知道的更多,那就在网上搜索一些蛇形填数的资料吧!
希望可以帮到您,有什么不对的欢迎批评指正!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马