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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

又是啥题目啊
回复 使用道具 举报
接受自己的挑战
回复 使用道具 举报
什么题目
回复 使用道具 举报
刘健 黑马帝 2013-4-30 17:43:01
44#
本帖最后由 刘健 于 2013-4-30 21:50 编辑

看看是不是挑战
看来是
目前成果:支持奇数生成,偶数螺旋方向是反的,没有*号
  1. public class test {
  2.         public static void main(String[] args) {  
  3.             //一共列数
  4.                 int n =4;  
  5.             int[][] pos = new int[n][n];
  6.             
  7.             //圈数,最外围算一圈
  8.             int oic = 0;
  9.             //生成矩形
  10.             for (int i = n; i >=1; i=i-2) {
  11.                         setnum(i, pos, oic);
  12.                         oic++;
  13.                 }
  14.             
  15.             /*输出*/  
  16.             for(int i = 0; i<n; i++){  
  17.                 for(int j = 0; j<n; j++){  
  18.                     if(pos[i][j]<10){  
  19.                         System.out.print(pos[i][j]+" "+" ");  
  20.                     }else{  
  21.                         System.out.print(pos[i][j]+" ");  
  22.                     }  
  23.                 }  
  24.                 System.out.println();  
  25.             }  
  26.         }

  27.         private static void setnum(int n, int[][] pos,int j) {
  28.                 //生成一圈的上面的横排
  29.                 int s = j;
  30.                 for (int i = 0; i < n; i++) {
  31.                         pos[j][s] = n*n -n + 1 + i;
  32.                         s++;
  33.                 }
  34.                
  35.                 //生成一圈的左面排
  36.                 int k = j+1;
  37.                 for (int i = 0; i < n-1; i++) {
  38.                         pos[k][j] = n*n -n -i;
  39.                         k++;
  40.                 }
  41.                
  42.                 //生成一圈的下面排
  43.                 for (int i = 0; i < n-1; i++) {
  44.                         pos[n-1+j][i+1+j] = n*n-n-(n-1)-i;
  45.                 }
  46.                
  47.                 //生成一圈的右面排
  48.                 for (int i = 0; i < n-2; i++) {
  49.                         pos[n-2+j-i][n-1+j] = n*n-n-(n-1)-i-(n-1);
  50.                 }
  51.         }  
  52. }
复制代码

点评

注释比较好,思路清晰,但是就是没完全按要求做,已经很好了,希望可以改进一下。  发表于 2013-5-1 10:35

评分

参与人数 1技术分 +3 收起 理由
黄玉昆 + 3

查看全部评分

回复 使用道具 举报
la aa a a a aa

点评

额,这个回复很有意思额  发表于 2013-5-1 10:36
回复 使用道具 举报
回复看看
回复 使用道具 举报
我来看看
回复 使用道具 举报
Yes~!必须挑战!失败过才会知道成功的喜悦
回复 使用道具 举报
看看。。。。。。。。。。。。
回复 使用道具 举报
  1. <div class="blockcode"><blockquote>package test;

  2. /**
  3. * 思路:
  4. *          n = 5
  5.            *   *   *   *   *   *   *
  6.            *  21  22  23  24  25   *
  7.            *  20   7   8   9  10   *
  8.            *  19   6   1   2  11   *
  9.            *  18   5   4   3  12   *
  10.            *  17  16  15  14  13   *
  11.            *   *   *   *   *   *   *
  12. *                 经过分析矩阵由两种类型的图形组成
  13. *                 由左上部分
  14. *                         包括左边和上边
  15. *                         1
  16. *
  17.                         7   8   9  
  18.                         6
  19.                         5

  20.                         21  22  23  24  25
  21.                         20
  22.                         19
  23.                         18
  24.                         17  
  25. *                 右下部分
  26. *                         包含右边和下边
  27.                                 2
  28.                         4   3
  29.                                                 10
  30.                                                 11
  31.                                                 12  
  32.                         16  15  14  13  
  33.                 最后外加一层*
  34. *
  35. * @author Administrator
  36. *
  37. */
  38. public class Test{
  39.         private static int x,y;
  40.         private static int[][] arr;
  41.         private static int count;
  42.         /**
  43.          * 顺时针生成左边和上边
  44.          * @param n                边的长度
  45.          */
  46.         private static void left2up(int n){
  47.                 for(int i = 0; i < n; i++){
  48.                         arr[x--][y] = count++;               
  49.                 }
  50.                 n--;
  51.                 x++;
  52.                 y++;
  53.                 for(int i = 0; i < n; i++){
  54.                         arr[x][y++] = count++;       
  55.                 }
  56.         }
  57.         /**
  58.          * 顺时针生成右边和下边
  59.          * @param n                边的长度
  60.          */
  61.         private static void right2down(int n){
  62.                 for(int i = 0; i < n; i++){
  63.                         arr[x++][y] = count++;       
  64.                 }
  65.                 n--;
  66.                 x--;
  67.                 y--;
  68.                 for(int i = 0; i < n; i++){
  69.                         arr[x][y--] = count++;                       
  70.                 }
  71.         }
  72.         /**
  73.          * 从里到外顺时针旋转产生矩阵(长宽相等)
  74.          * @param n                矩阵的规模
  75.          */
  76.         public static void spiral(int n){               
  77.                 //起点
  78.                 x = (n - 1)/2;
  79.                 y = x;
  80.                 arr = new int[n][n];
  81.                 count = 1;
  82.                 for(int i = 1; i <= n; i++){
  83.                         if( i % 2  == 1 ){
  84.                                 left2up(i);
  85.                         }else{
  86.                                 right2down(i);
  87.                         }
  88.                 }
  89.         }
  90.        
  91.        
  92.         //下面的方法用于打印
  93.         /**
  94.          * 计算十进制数字的位数
  95.          * @param num                要计算的数组
  96.          * @return                        返回用十进制表示这个数组时的位数
  97.          */
  98.         private static int count(int num){
  99.                 int cnt = 0;
  100.                 while(num != 0){
  101.                         cnt++;
  102.                         num /= 10;
  103.                 }
  104.                
  105.                 return cnt;
  106.         }
  107.         /**
  108.          * 打印一行*
  109.          * @param m                矩阵的规模
  110.          * @param cnt        最大数字的长度
  111.          */
  112.         private static void printStars(int m, int cnt){
  113.                 StringBuilder sb = new StringBuilder(getSpaces(1, cnt));
  114.                 sb.append("*");               
  115.                 String str = sb.toString();
  116.                 for(int i = 0, len = m+2; i < len; i++){
  117.                         System.out.print(str);
  118.                 }
  119.                 System.out.println();
  120.         }
  121.         /**
  122.          * 生成打印数字之前应该打印的空格
  123.          * @param n                        要打印的数字               
  124.          * @param cnt                数字的最大长度
  125.          * @return                        打印数字之前应该打印的空格
  126.          */
  127.         public static String getSpaces(int n, int cnt){
  128.                 StringBuilder spacesSb = new StringBuilder("  ");       
  129.                 int tmpCnt = count(n);               
  130.                 for(int k = 0; k < cnt - tmpCnt; k++){
  131.                         spacesSb.append(" ");
  132.                 }
  133.                
  134.                 return spacesSb.toString();
  135.         }
  136.         /**
  137.          * 打印生成的二维数组,保证良好的格式,每个数占有的长度相同且随着数组的大小自动调整,
  138.          * 不够的用空格补足。
  139.          *
  140.          * @param matrix        要打印的数组
  141.          * @param m                        数组的行数
  142.          * @param n                        数组的列数
  143.          */
  144.         public static void printMatrix(int[][] matrix, int m, int n){               
  145.                 int cnt = count(m*n);
  146.                 //打印一行"*"               
  147.                 printStars(m, cnt);
  148.                 for(int i = 0; i < m; i++){
  149.                         System.out.print(getSpaces(1, cnt)+"*");
  150.                         for(int j = 0; j < n; j++){                                                       
  151.                                 System.out.print(getSpaces(matrix[i][j], cnt));
  152.                                 System.out.print(matrix[i][j]);
  153.                         }
  154.                         System.out.println(getSpaces(1, cnt)+"*");
  155.                 }
  156.                 //打印一行"*"               
  157.                 printStars(m, cnt);
  158.         }
  159.         public static void main(String[] args){
  160.                 for(int i = 1; i <= 30; i++){
  161.                         System.out.println("n = "+i);
  162.                         spiral(i);
  163.                         printMatrix(arr,i,i);
  164.                         System.out.println();
  165.                 }
  166.         }
  167. }
复制代码

点评

你的程序很规范,思路,注释,层次都很好,继续加油。  发表于 2013-5-2 14:52
速度真快,注释比较全,思路清晰,但是能不能不要用循环啊,直接输入什么值就打印相应的就可以了。总体很好  发表于 2013-5-1 10:41

评分

参与人数 1技术分 +4 收起 理由
黄玉昆 + 4

查看全部评分

回复 使用道具 举报
试试看了
回复 使用道具 举报
    看看  
回复 使用道具 举报
来,打开
回复 使用道具 举报
挑战,看题~~~
回复 使用道具 举报
不尝试,怎么知道自己到底行不行呢?要勇于挑战{:soso_e100:}
回复 使用道具 举报
来支持下,顺便看看题目
回复 使用道具 举报
我的入学测试倒数第二道和这个类似

点评

额,早点休息吧,嘿嘿  发表于 2013-4-30 23:48
回复 使用道具 举报
李培根 发表于 2013-4-30 23:18
来支持下,顺便看看题目

培根,还没睡呢啊

点评

没有权限,回复内容看不了  发表于 2013-4-30 23:45
回复 使用道具 举报
李培根 发表于 2013-4-30 23:19
我的入学测试倒数第二道和这个类似

就是根据那个改编的,嘿嘿

点评

没有权限,回复内容看不了。。。  发表于 2013-4-30 23:44
回复 使用道具 举报
看看~!~!~!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马