本帖最后由 崔宏奎 于 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个元素- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Timers;
- namespace Question
- {
- class Program
- {
- static void Main(string[] args)
- {
- //计数:
- int start = 1;
- //保存用户输入的值
- int num;
- string str;
- do
- {
- Console.Write("请输入一个整数:");
- str = Console.ReadLine();
- } while (!int.TryParse(str, out num) || num < 1);
- string[,] arr = new string[num + 2, num + 2]; //创建保存数据用的数组
- //计算起始位置:
- int col = (num +1) / 2, row = (num + 1) / 2; //pos=1;
- //第一个点赋值
- arr[col, row] = start++.ToString();
- //n>2时,开始循环
- for (int i = 0; i < num - 1; ++i)
- {
- if (i % 2 == 1) //单数
- {
- //单数时,将左面的单元格赋值
- arr[col, --row] = start++.ToString();
- //上移
- for (int j = 0; j <= i; ++j)
- {
- arr[--col, row] = start++.ToString();
- }
- //右移
- for (int j = 0; j <= i; ++j)
- {
- arr[col, ++row] = start++.ToString();
- }
- }
- else //偶数
- {
- //偶数时,将右面的单元格赋值
- arr[col, ++row] = start++.ToString();
- //下移
- for (int j = 0; j <= i; ++j)
- {
- arr[++col, row] = start++.ToString();
- }
- //左移
- for (int j = 0; j <= i ; ++j)
- {
- arr[col, --row] = start++.ToString();
- }
- }
- }
- //在外围加上"*"
- for (int i = 0; i < num + 2; ++i)
- {
- arr[0, i] = "*";
- arr[i, 0] = "*";
- arr[i, num + 1] = "*";
- arr[num + 1, i] = "*";
- }
- //打印数组元素
- PrintArr(arr);
- Console.ReadKey();
- }
- //打印函数
- public static void PrintArr(string[,] arr)
- {
- int len = arr.GetLength(0);
- for (int i = 0; i < len; ++i)
- {
- for (int j = 0; j < len; ++j)
- {
- Console.Write("{0}\t", arr[i, j]);
- }
- Console.WriteLine();
- }
- }
-
- }
- }
复制代码 |
|