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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄玉昆 于 2013-5-2 15:40 编辑

下面的一道题是我给刘胜寒出的一道题,大家也可以参与做一做啊,有惊喜哦
这道题是给敢于挑战,敢于挖掘自己潜力的人出的,如果谁觉得能在规定时间做出来,敢于挑战我的题目,那么你就是厉害的,我就是佩服你的。
如果你觉得自己还不敢挑战,没关系,以后还有机会,不敢挑战的或者认为自己还差点的,那么就不要回复了。
另外,我会根据回复的时间,来评分的,回复越快,答案越清晰,分数当然越高了。


如果来挑战了,大家直接在本楼层编辑即可,不会编辑的请看帖:http://bbs.itheima.com/thread-42978-1-1.html,可以看其中的沙发层的“编辑贴”说明

规定时间:48小时,即从2013.4.30-5.2的9:00

注:如果你是真正的黑马,敢挑战,就要完完全全自己做出来,如果是从网上当的,那么算了吧,我鄙视这样的人,这样的人给黑马丢人,更丢自己的人。
不过我相信大家都是好样的,有能力自己做出来。

话不多说,看题(回复可见哦):
游客,如果您要查看本帖隐藏内容请回复


我把相对比较好的传上来,大家可以看一看啊(排名不分先后)
曹睿翔.zip (1.19 KB, 下载次数: 61)
蓝色骨头.zip (1.48 KB, 下载次数: 40)
丘凤光.zip (1.08 KB, 下载次数: 44)
李罡.zip (1.4 KB, 下载次数: 39)

161 个回复

倒序浏览
本帖最后由 丘凤光 于 2013-4-30 11:53 编辑

昆哥又有啥好活动了?

真是不容易的题啊  

绝对自己写

MyPrint.zip

1.08 KB, 阅读权限: 100, 下载次数: 1

代码

评分

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

查看全部评分

回复 使用道具 举报
看看,这是个什么样的题目
回复 使用道具 举报
看看是什么题目,自己有能力吗???
回复 使用道具 举报
恩,虽然不确定会不会做,但是挑战是必须敢的
回复 使用道具 举报
我来瞅瞅   
回复 使用道具 举报
我也来看看是什么题目
回复 使用道具 举报
杜超 高级黑马 2013-4-30 09:03:53
8#
试试看看
回复 使用道具 举报
前来打擂!!
回复 使用道具 举报
本帖最后由 hyw840705183 于 2013-5-1 14:19 编辑

我看下什么题目

以下是我的代码:
  1. class Test
  2. {
  3. private String[][] a=new String[0][0];//定义一个字符串数组
  4.         private int x=0,y=0;//初始化数组行与列
  5.         private int number=1;//第一个数字
  6.         private String string;//数字转换的字符串

  7.         public Test(int length)
  8.         {
  9.                 a=new String[length+2][length+2];//由于外围有*号,故给数组分配空间要多2个
  10.                 x=(length+1)/2;//确定第一个数字1的行位置
  11.                 y=(length+1)/2;//确定第一个数字1的列位置

  12.                 /*下面的for循环是初始化外围的*号*/
  13.                 for(int l=0;l<length+2;l++)
  14.                 {
  15.                         for(int k=0;k<length+2;k++)
  16.                         {
  17.                                 if(l==0||l==length+1)
  18.                                 {
  19.                                         a[l][k]="*";//如果行号为第一行和最后一行,则为其赋值为*
  20.                                 }
  21.                                 else
  22.                                 {
  23.                                         if(k==0||k==length+1)
  24.                                         {
  25.                                                 a[l][k]="*";//如果不是的话,则判断是不是第一列和最后一列,是则为其赋值*
  26.                                         }
  27.                                         else
  28.                                                 continue;//否则跳出本次循环
  29.                                 }
  30.                         }
  31.                 }
  32.                 a[x][y]=toString(1);//把1转换为字符串赋值给数组
  33.                 toRight();//第一次则往右边开始自增
  34.         }

  35.         /*数字往上面增加*/
  36.         private void toUp()
  37.         {
  38.                 if(a[x-1][y]==null)
  39.                 {
  40.                         assignment(--x, y);//x-1行y列上没有值,则赋值
  41.                         if(a[x][y+1]==null)
  42.                         {
  43.                                 toRight();//赋值后的位置的上面为空则转向往右自增数字
  44.                         }
  45.                         else
  46.                                 toUp();//否则继续向上自增赋值
  47.                 }
  48.         }

  49.         /*数字往下面增加*/
  50.         private void toDown()
  51.         {
  52.                 if(a[x+1][y]==null)
  53.                 {
  54.                         assignment(++x, y);//x+1行y列上没有值,则赋值
  55.                         if(a[x][y-1]==null)
  56.                         {
  57.                                 toLeft();//赋值后的位置的上面为空则转向往左自增数字
  58.                         }
  59.                         else
  60.                                 toDown();//否则继续向下自增赋值
  61.                 }
  62.         }

  63.         /*数字往左边增加*/
  64.         private void toLeft()
  65.         {
  66.                 if(a[x][y-1]==null)
  67.                 {
  68.                         assignment(x, --y);//x行y-1列上没有值,则赋值
  69.                         if(a[x-1][y]==null)
  70.                         {
  71.                                 toUp();//赋值后的位置的上面为空则转向往上自增数字
  72.                         }
  73.                         else
  74.                                 toLeft();//否则继续向左自增赋值
  75.                 }
  76.         }   
  77.         
  78.         /*数字往右边增加*/
  79.         private void toRight()
  80.         {
  81.                 if(a[x][y+1]==null)
  82.                 {
  83.                         assignment(x, ++y);//x行y+1列上没有值,则赋值
  84.                         if(a[x+1][y]==null)
  85.                         {
  86.                                 toDown();//赋值后的位置的上面为空则转向往下自增数字
  87.                         }
  88.                         else{
  89.                                 toRight();//否则继续向右自增赋值
  90.                         }
  91.                 }
  92.         }  
  93.         
  94.         /*给数组赋值*/
  95.         private void assignment(int x,int y)
  96.         {
  97.                 number++;//数字自增
  98.                 string=toString(number);//将数字转换为字符串
  99.                 a[x][y]=string;//将字符串赋值给数组
  100.         }

  101.         /*将数字转换为字符串,返回字符串*/
  102.         private String toString(int num)
  103.         {
  104.                 return String.valueOf(num);
  105.         }
  106.         
  107.         /*打印出所有的数字和*号*/
  108.         public void print()
  109.         {
  110.                 for(int i=0;i<a.length;i++)
  111.                 {
  112.                         for(int j=0;j<a.length;j++)
  113.                         {
  114.                                 System.out.print(a[i][j]+"\t");//输出的值用制表符\t空开
  115.                         }
  116.                 System.out.println();
  117.                 }
  118.         }
  119. }

  120. /*主类*/
  121. public class TestMain
  122. {
  123.         public static void main(String[] args)//主函数
  124.         {
  125.     java.util.Scanner in = new java.util.Scanner(System.in);//创建输入对象
  126.     System.out.println("Please input a >0's integer number,presss 0 exit...");
  127.     int number = in.nextInt();//用number接收输入的值
  128.     while(number != 0)//设置输入循环,输入0退出
  129.     {
  130.      if(number < 0)
  131.       System.out.println(number+" is invaild!");//输入小于0则提示错误
  132.      else
  133.       new Test(number).print();//创建对象调用print()
  134.      System.out.println("\nPlease input a >0's integer number,presss 0 exit...");
  135.      number = in.nextInt();//循环输入
  136.     }
  137.         }
  138. }
复制代码
这下可以了,改了下主类,也可以循环输入。。。
运行结果如图

运行结果.PNG (2.88 KB, 下载次数: 0)

n=5的运行结果

n=5的运行结果

评分

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

查看全部评分

回复 使用道具 举报
看看是啥。
回复 使用道具 举报
本帖最后由 黑马伍哲沂 于 2013-4-30 20:44 编辑

有点思路,把这矩阵分成4部分。把值分别存入二维数组。打印的时候,*号用强转。
但我觉得我做不下去了。。来宣布放弃的了。。。。  

如下图,真心不敢往下找规律了,头疼= =。

123.jpg (28.74 KB, 下载次数: 0)

123.jpg

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 李德全 于 2013-4-30 13:46 编辑

看看啥题

做出来啦,嘻嘻
  1. /*
  2. 需求:顺时针螺旋数字

  3. 说明:        老师,我刚学了7天毕老师基础视频,
  4.                 不知道怎么获取输入数字,
  5.                 就用主函数main中的String[] args传递。
  6.                 老师您验证的时候请麻烦传递一下。*_*

  7. 思路:
  8. 1.螺旋为顺时针,且以4为周期重复。
  9. 2.螺旋规律为:
  10. 循环次数        1        2        ...        

  11.         Y加                1        3        .
  12.         X加                1        3        .
  13.         Y减                2        4        .
  14.         X减                2        4


  15. */


  16. class ShuZhuDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 int z = Integer.parseInt(args[0]);        //获取输入数字
  21.                 System.out.println("输入的数字为:"+z);
  22.                
  23.                 int[][] arr = new int[z+2][z+2];        //创建数组
  24.                 int mid;                                                        //数字1的位置坐标
  25.                 if(z%2==0)                //偶数
  26.                         mid = z/2;
  27.                 else                        //奇数
  28.                         mid = (z+1)/2;

  29.                 /*开始计算*/

  30.                 int up = 1;        //X,Y增减的值。规律为:1,1,2,2,3,3,4,4,....
  31.                 int con=1;        //螺旋位置计数 好比一长方形四条边的位置,1,2,3,4分别代表上边,右边,下边,左边
  32.                 for(int x=mid, y=mid, m=1; m<=z*z ; m++ )
  33.                 {
  34.                         arr[x][y] = m;
  35.                         switch(con)
  36.                         {
  37.                                 case 1:
  38.                                         if(y<mid+up)
  39.                                                 y++;
  40.                                         else
  41.                                         {                                                       
  42.                                                 con++;
  43.                                                 x++;
  44.                                         }
  45.                                         break;
  46.                                 case 2:
  47.                                         if(x<mid+up)
  48.                                                 x++;
  49.                                         else
  50.                                         {
  51.                                                 y--;
  52.                                                 con++;                                                       
  53.                                         }
  54.                                         break;
  55.                                 case 3:
  56.                                         if(y>mid-up)
  57.                                                 y--;
  58.                                         else
  59.                                         {
  60.                                                 x--;
  61.                                                 con++;
  62.                                         }
  63.                                         break;
  64.                                 case 4:
  65.                                         if(x>mid-up)
  66.                                                 x--;
  67.                                         else
  68.                                         {                                                       
  69.                                                 con = 1;
  70.                                                 y++;
  71.                                                 up++;
  72.                                         }
  73.                                         break;
  74.                                 default: break;
  75.                                
  76.                         }
  77.                 }
  78.                 System.out.println("经过计算得:");
  79.                 System.out.println();
  80.                 for(int x=0; x<z+2; x++)                //打印数组
  81.                 {
  82.                         for(int y=0; y<z+2; y++)
  83.                                 if(arr[x][y]==0)
  84.                                         System.out.print("*\t");        //数组0元素替换为*
  85.                                 else
  86.                                         System.out.print(arr[x][y]+"\t");
  87.                         System.out.println();
  88.                         System.out.println();
  89.                 }
  90.         }
  91. }
复制代码
请老师指导!

点评

速度较快,思路较清晰,提示较友好,但输入0时无需直接打印;注释稍微改进一下,间距有些大。学了7天能做成这样,真不错  发表于 2013-5-1 10:12
如果来挑战了,直接在本楼层编辑即可,谢谢  发表于 2013-4-30 10:19

评分

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

查看全部评分

回复 使用道具 举报
我挑战下看看
回复 使用道具 举报
本帖最后由 王亚东 于 2013-4-30 16:15 编辑

  1. public class Demo01 {

  2. public static void print(int[][] nums,int n,int lv2,int lv1){
  3. if(n == 2){
  4. nums[lv1][lv1] = 1;
  5. nums[lv1][lv1+1] = 2;
  6. nums[lv1+1][lv1] = 4;
  7. nums[lv1+1][lv1+1]= 3;
  8. fillIn(nums);
  9. for(int[] line : nums){
  10. for(int i: line){
  11. if(i == -1){
  12. System.out.print("* ");
  13. continue;
  14. }
  15. System.out.print(i+" ");
  16. if(i<10)
  17. System.out.print(" ");
  18. }
  19. System.out.println();
  20. }
  21. return;
  22. }
  23. if(n%2==0){
  24. for(int i = 0;i<n;i++){
  25. nums[n-1+lv2][i+lv2] = n*n-i;
  26. }
  27. for(int i = 0;i<n-1;i++){
  28. nums[i+lv2][n-1+lv2] = n*n-(n-1)*2+i;
  29. }
  30. print(nums,n-1,lv2,lv1);
  31. }else{
  32. for(int i = 0;i<n;i++){
  33. nums[lv1][lv1+i] = n*n-(n-1)+i;
  34. }
  35. for(int i = 0;i<n-1;i++){
  36. nums[(n-1-i)+lv1][lv1] = n*n-(n-1)*2+i;
  37. }
  38. print(nums,n-1,lv2+1,lv1+1);
  39. }
  40. }

  41. private static void fillIn(int[][] nums){
  42. int n = nums.length;
  43. for(int i = 0;i<n-1;i++){
  44. nums[0][i] = -1;
  45. }
  46. for(int i = 1;i<n-1;i++){
  47. nums[i][0] = -1;
  48. }
  49. for(int i = 0;i<n-1;i++){
  50. nums[n-1][i] = -1;
  51. }
  52. for(int i = 0;i<n;i++){
  53. nums[i][n-1] = -1;
  54. }
  55. }

  56. public static void main(String[] args) throws Exception {
  57. int n = 4;
  58. int[][] nums = new int[n+2][n+2];
  59. print(nums,n,1,1);
  60. }
  61. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
路过```每回都是提醒都是需要10个字符。

点评

如果来挑战了,直接在本楼层编辑即可,谢谢  发表于 2013-4-30 10:20
其实你完全可以用空格代替额  发表于 2013-4-30 10:16
回复 使用道具 举报
{:soso_e114:}
回复 使用道具 举报
游客,如果您要查看本帖隐藏内容请回复
回复 使用道具 举报
你丫的 图片 是用excel 做的吧
回复 使用道具 举报
刘胜寒 发表于 2013-4-30 10:24
你丫的 图片 是用excel 做的吧

嘿嘿,当然了,要不手工多费事啊,;P
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马