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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

过来看一看题
回复 使用道具 举报
啥东西!!!!!!!!!
回复 使用道具 举报
黑马田杰 来自手机 中级黑马 2013-5-1 08:44:49
103#
挑战一下
回复 使用道具 举报
本帖最后由 清朗的晨风 于 2013-5-1 09:00 编辑

终于写好了,完全自己写的,没有任何百度。。。希望滔哥指点下。
  1. class Program
  2.     {
  3.         static int find(int i, int j, int n)
  4.         {
  5.             if (n % 2 == 1)//边长为奇数时调用这个
  6.             {
  7.                 if (i == 1) return n * (n - 1) + j;
  8.                 if (j == 1) return n * (n - 1) + 2 - i;
  9.                 if (i == n) return (n-1) * (n-1) - j + 2;
  10.                 if (j == n) return (n-2) * (n - 2)-1 + i;
  11.                 return find(i - 1, j - 1, n - 2);//递归调用内圈
  12.             }
  13.             else//边长为偶数数时调用这个
  14.             {            
  15.                 if (i == n) return n * n - j + 1;
  16.                 if (j == n) return n * n - 2 * n + 1 + i;
  17.                 if (i == 1) return (n -1)* (n - 2) + j;
  18.                 if (j == 1) return (n - 1) * (n - 2) + 2 - i;
  19.                 return find(i-1, j-1, n-2);//递归调用内圈
  20.             }
  21.         }

  22.         static void Main(string[] args)
  23.         {
  24.             int n, i, j;
  25.             Console.Write("请输入一个数字:");
  26.             if (Int32.TryParse(Console.ReadLine(), out n))
  27.             {
  28.                 int[,] number = new int[n + 2, n + 2];//定义个二维数组
  29.                 for (i = 1; i <= n; i++)
  30.                     for (j = 1; j <= n; j++)
  31.                         number[i, j] = find(i, j, n);

  32.                 for (i = 0; i <= n + 1; i++)
  33.                 {
  34.                     for (j = 0; j <= n + 1; j++)
  35.                     {
  36.                         if (i == 0 || j == 0 || i == n + 1 || j == n + 1)
  37.                             Console.Write("  * ");//打印最外层的*
  38.                         else
  39.                             Console.Write("{0,4}", number[i, j]);
  40.                     }
  41.                     Console.WriteLine();
  42.                 }
  43.                 Console.ReadKey();
  44.             }
  45.             else
  46.                 Console.WriteLine("输入的不是数字");
  47.         }
  48.     }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
看题。。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
尝试一下。
回复 使用道具 举报
陈圳 发表于 2013-4-30 10:40

这个设置作者可见,我到时候有空告诉你啊,你也可以私下问我,现在有点忙,嘿嘿
回复 使用道具 举报
曹睿翔 发表于 2013-4-30 13:13
我来晚了啊,玉圣!时间不对吧,48小时not equal to今天十点到明天吧9点吧,我还在店里,回宿舍看看
我的网 ...

代码稀少?还是觉得太多代码了,没来得及继续抽取
需要的话我画出图形步骤,以前没做个这类型题,不知道解决的最简单的思路,有好的发来看看
测试代码不去为好,自己回头看可以知道怎么解决问题的

点评

我点评用错词了?额,我是说注释稀少,不是代码。  发表于 2013-5-1 14:18
回复 使用道具 举报
李德全 发表于 2013-4-30 09:55
看看啥题

做出来啦,嘻嘻请老师指导!

恩恩,谢谢黄老师指导,我会改正的。
回复 使用道具 举报
顶版主,看看先
回复 使用道具 举报
To 金牌黑马 2013-5-1 10:56:52
111#
我要挑战
回复 使用道具 举报
杞文明 发表于 2013-5-1 02:40
弄了一哈! 哎!  好麻烦哦!

后来修改 忘记了  呵呵
回复 使用道具 举报
搞这么神秘干什么

点评

你也来试试,要是都看到题了,那就没法通过回复的时间评分了。  发表于 2013-5-1 14:19
回复 使用道具 举报
刘胜寒 发表于 2013-4-30 13:33

要是个0
应该输出
**
**
是不是...
笔记本到了...
系统崩了...

点评

额。你的啥系统啊,去系统之家下一个吧,刚到就崩了?太犀利了  发表于 2013-5-1 14:18
回复 使用道具 举报
李德全 发表于 2013-5-1 10:37
恩恩,谢谢黄老师指导,我会改正的。

额,我不是老师,是和你一样的正在为进入黑马奋斗的一员,希望共同进步,加油
回复 使用道具 举报
刘胜寒 发表于 2013-5-1 11:42
要是个0
应该输出
**

额。你的啥系统啊,去系统之家下一个吧,刚到就崩了?太犀利了
回复 使用道具 举报
我也来看一下
回复 使用道具 举报
曹睿翔 发表于 2013-5-1 10:31
代码稀少?还是觉得太多代码了,没来得及继续抽取
需要的话我画出图形步骤,以前没做个这类型题,不知道 ...

我点评用错词了?额,我是说注释稀少,不是代码。
回复 使用道具 举报
郭利超 发表于 2013-5-1 11:41
搞这么神秘干什么

你也来试试,要是都看到题了,那就没法通过回复的时间评分了。
回复 使用道具 举报
本帖最后由 崔宏奎 于 2013-5-1 14:22 编辑

滔哥这个题,本来看的时候就是个转圈的写入数字,结果分析了一下才明白不是那么好写,贴出来思路与大家分享:
1.找规律,本想着三个就会有规律,还是画了四个才找出来:

在不看外围的“*”情况下,发现的规律: 1.用户输入的n和最后的图形长宽一样,也就是说n=3时,一共3*3=9个数,n=4时16个数.

2.找了找每次n+1时,增长的规律:

n=4时,在3*3的基础上,右边和下边各增加一条边,拼成一个4*4的图形。
n=5时,在4*4的基础上,在左边和上边增加一条边,拼成一个5*5的图形。
。。。。。。
规律差不多找到了,n是个大于等于1的整数,第n条边有n个数字,第n条边的位置是由(n是否为奇偶数)确定的。

3.写代码了:
我的思路是这样的,
a.用一个两维数组实现数据的存储
b.数字是每次+1,就用一个变量来表示,变量每次赋值完之后+1
c.数字从1开始,一共n*n个,的起始位置也比较好确定,奇数偶数都在中间,(n-1)/2就算出了位置
d.每次赋值时需要上一个数字所在的位置,用两个变量来保存col,row

然后从中间开始循环,
第一圈时,n=1,只有1的位置有数字,图形1*1=1
第二圈时,n=2,偶数!在右面增加一个数,然后在上一个数字的右面,下面增加一条边,边长为1个元素
第二圈时,n=3,奇数!在左面增加一个数,然后在上一个数字的左面,上面增加一条边,边长为2个元素
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Timers;

  6. namespace Question
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //计数:
  13.             int start = 1;
  14.             //保存用户输入的值
  15.             int num;
  16.             string str;
  17.             do
  18.             {
  19.                 Console.Write("请输入一个整数:");
  20.                 str = Console.ReadLine();
  21.             } while (!int.TryParse(str, out num) || num < 1);

  22.             string[,] arr = new string[num + 2, num + 2]; //创建保存数据用的数组
  23.             //计算起始位置:
  24.             int col = (num +1) / 2, row = (num + 1) / 2;  //pos=1;
  25.             //第一个点赋值
  26.             arr[col, row] = start++.ToString();

  27.             //n>2时,开始循环
  28.             for (int i = 0; i < num - 1; ++i)
  29.             {
  30.                 if (i % 2 == 1)   //单数
  31.                 {
  32.                     //单数时,将左面的单元格赋值
  33.                     arr[col, --row] = start++.ToString();
  34.                     //上移
  35.                     for (int j = 0; j <=  i; ++j)
  36.                     {
  37.                         arr[--col, row] = start++.ToString();
  38.                     }
  39.                     //右移
  40.                     for (int j = 0; j <=  i; ++j)
  41.                     {
  42.                         arr[col, ++row] = start++.ToString();
  43.                     }
  44.                 }
  45.                 else   //偶数
  46.                 {
  47.                     //偶数时,将右面的单元格赋值
  48.                     arr[col, ++row] = start++.ToString();
  49.                     //下移
  50.                     for (int j = 0; j <= i; ++j)
  51.                     {
  52.                         arr[++col, row] = start++.ToString();
  53.                     }
  54.                     //左移
  55.                     for (int j = 0; j <=  i ; ++j)
  56.                     {
  57.                         arr[col, --row] = start++.ToString();
  58.                     }

  59.                 }

  60.             }
  61.             //在外围加上"*"
  62.             for (int i = 0; i < num + 2; ++i)
  63.             {
  64.                 arr[0, i] = "*";
  65.                 arr[i, 0] = "*";
  66.                 arr[i, num + 1] = "*";
  67.                 arr[num + 1, i] = "*";
  68.             }
  69.             //打印数组元素
  70.             PrintArr(arr);

  71.             Console.ReadKey();

  72.         }
  73.         //打印函数
  74.         public static void PrintArr(string[,] arr)
  75.         {
  76.             int len = arr.GetLength(0);
  77.             for (int i = 0; i < len; ++i)
  78.             {

  79.                 for (int j = 0; j < len; ++j)
  80.                 {
  81.                     Console.Write("{0}\t", arr[i, j]);
  82.                 }
  83.                 Console.WriteLine();
  84.             }
  85.         }
  86.       
  87.     }
  88. }
复制代码

Question.rar

26.66 KB, 下载次数: 4

点评

不过,希望你能把注释写清楚些,这样会好一点  发表于 2013-5-1 12:50
好吧,是我看错了,原来你用的是C#写的,我真心晕啊,不过运行了,很好,就是输入0的时候,应该有个提示比较好  发表于 2013-5-1 12:37

评分

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

查看全部评分

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