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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fcyan86 中级黑马   /  2013-6-3 17:43  /  1093 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fcyan86 于 2013-6-4 15:52 编辑

昨天在黑马看到个这人题,要求如下图所示旋转输出

我的实现代码如下:
  1. private static void ShowNumber(int n)
  2.         {
  3.             Console.WriteLine("得到的图形为:");
  4.             int[,]showArr=new int[n,n];
  5.             for (int i = n,j=0; i > 0; i -= 2,j++)
  6.             {
  7.                 for (int k = (n-i)/2,m=i*(i-1)+1; k < i+(n-i)/2; k++,m++)
  8.                 {
  9.                     showArr[j,k]=m;
  10.                 }
  11.             }
  12.             for (int i = 0; i < n/2 + 1; i++)
  13.             {

  14.                 for (int j = i, m = showArr[i, i];j<n-i;m--,j++)
  15.                 {
  16.                     showArr[j, i] = m;
  17.                 }
  18.             }
  19.             for (int i = n/2; i<n; i++)
  20.             {
  21.                 for (int j = n-i-1, m = showArr[i, n-i-1]; j < i+1; m--,j++)
  22.                 {
  23.                     showArr[i, j] = m;
  24.                 }
  25.             }
  26.             for (int i = n - 1; i > n/2; i--)
  27.             {
  28.                 for(int j=i,m=showArr[i,i];j>n-i-1;j--,m--)
  29.                 {
  30.                     showArr[j, i] = m;
  31.                 }
  32.             }
  33.             StringBuilder showStr=new StringBuilder();
  34.             for (int i = 0; i < n + 2; i++)
  35.             {
  36.                 showStr.Append("*\t");
  37.             }
  38.             Console.WriteLine(showStr);
  39.             for (int i = 0; i < n; i++)
  40.             {
  41.                 Console.Write("*\t");
  42.                 for(int j=0;j<n;j++)
  43.                     Console.Write(showArr[i,j]+"\t");
  44.                 Console.WriteLine("*");
  45.             }
  46.             Console.WriteLine(showStr);
  47.         }
复制代码
  1. Console.WriteLine("请输入n的值:");
  2.             int n = 0;
  3.             do
  4.             {
  5.                 if (int.TryParse(Console.ReadLine(), out n)&&n%2!=0)
  6.                     break;
  7.                 else
  8.                 {
  9.                     Console.WriteLine("输入的n必须为奇数,请重新输入:");
  10.                 }
  11.             } while (true);
  12.             ShowNumber(n);
复制代码
各位大神们有没有简单些的

3 个回复

倒序浏览
{:soso_e183:}
回复 使用道具 举报
本帖最后由 fcyan86 于 2013-6-4 09:10 编辑
c15881291595 发表于 2013-6-4 08:08
我是通过判断旋转方向一个一个输出的  限制的整数只要大于1就行  不需要是奇数! 至于写的代码  还是有好多 ...

这样就和你的差不多了
  1. private static void ShowRotate(int n)
  2.         {
  3.             int[,]arr=new int[n,n];
  4.             //中心坐标
  5.             int center = n%2 == 0 ? n/2-1 : n/2;
  6.             //当前的坐标
  7.             int xIndex = center+1;
  8.             int yIndex = center;
  9.             //填写中心点
  10.             arr[center, center] = 1;
  11.             //旋转方向
  12.             int direction = 0;
  13.             for (int i = 2; i <= n*n; i++)
  14.             {
  15.                 #region
  16.                 arr[xIndex, yIndex] = i;
  17.                 #region
  18.                 //从右到左
  19.                 if (xIndex - center > 0 && xIndex == yIndex)
  20.                     direction = 1;
  21.                 //从上到下
  22.                 else if(xIndex-center>0&&xIndex+yIndex==(n-1+n%2))
  23.                 {
  24.                     direction = 2;
  25.                 }
  26.                 //从下到上
  27.                 else if(xIndex-center<0&&xIndex+yIndex==n-2+n%2)
  28.                 {
  29.                     direction = 3;
  30.                 }
  31.                 //从左到右
  32.                 else if(xIndex-center<0&&xIndex==yIndex)
  33.                 {
  34.                     direction = 0;
  35.                 }
  36.                 #endregion
  37.                 //根据方向移动从标
  38.                 switch (direction)
  39.                 {
  40.                     case 0:
  41.                         xIndex++;break;
  42.                     case 1:
  43.                         xIndex--;break;
  44.                     case 2:
  45.                         yIndex++;break;
  46.                     case 3:
  47.                         yIndex--;break;
  48.                 }
  49.                 #endregion
  50.             }

  51.             //显示部分
  52.             #region
  53.             StringBuilder showStr = new StringBuilder();
  54.             for (int i = 0; i < n + 2; i++)
  55.             {
  56.                 showStr.Append("*\t");
  57.             }
  58.             Console.WriteLine(showStr);
  59.             for (int i = 0; i < n; i++)
  60.             {
  61.                 Console.Write("*\t");
  62.                 for (int j = 0; j < n; j++)
  63.                     Console.Write(arr[j, i] + "\t");
  64.                 Console.WriteLine("*");
  65.             }
  66.             Console.WriteLine(showStr);
  67.             #endregion
  68.         }
复制代码
Main函数代码:
  1. static void Main(string[] args)
  2.         {
  3.             Console.WriteLine("请输入n的值:");
  4.             int n = 0;
  5.             do
  6.             {
  7.                 if (int.TryParse(Console.ReadLine(), out n)&&n>1)
  8.                     break;
  9.                 else
  10.                 {
  11.                     Console.WriteLine("输入的n必须为整数,请重新输入:");
  12.                 }
  13.             } while (true);
  14.             ShowRotate(n);
  15.         }
复制代码
回复 使用道具 举报
兄弟。我想是思路问题不是。。难不难

我先占个位,晚上回复

简单思路如下。。
如1 行。。输出 1个数
如2 行。。输出 4个数
如3行。。输出 9个数

你会发现。。有个规律是。。行数相乘
然后在考虑如何输出。。的问题。。

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