LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4674|回复: 21

求算法

[复制链接]
发表于 2002-11-8 19:38:09 | 显示全部楼层 |阅读模式
我和前面的不同
我要打印的是:

1 2 3
8 9 4
7 6 5

就是把n^2个数字按照正方型,并且是顺时针方向打印出来

发表于 2002-11-8 20:53:07 | 显示全部楼层
能不能把来龙去脉讲清楚,实现算法的前提条件是什么?
发表于 2002-11-8 22:31:35 | 显示全部楼层
看明白了。这可直是难题呀!
发表于 2002-11-9 12:04:32 | 显示全部楼层
程序如下:

  1. #include<stdio.h>
  2. main()
  3. {
  4.         int i,j,n,k,k1,k2,p;
  5.         while(1){
  6.         printf("Please input a num:");
  7.         scanf("%d",&n);
  8.                 if(!n)
  9.                         return;
  10.         for(i=1;i<=n;i++)
  11.         {
  12.                 for(j=1;j<=n;j++)
  13.                 {
  14.                         if(i<=n/2)
  15.                         {
  16.                                 k1=i;
  17.                         }
  18.                         else
  19.                                 k1=n+1-i;
  20.                         if(j<=n/2)
  21.                         {
  22.                                 k2=j;
  23.                         }
  24.                         else
  25.                                 k2=n+1-j;
  26.                        
  27.                         if(k1<=k2)
  28.                                 k=k1;
  29.                         else
  30.                                 k=k2;
  31.                        
  32.                         p=4*n*(k-1)-4*(k-1)*(k-1);

  33.        
  34.                         if(i==k){
  35.                                 printf("%3d ",(j+1-k)+p);
  36.                                 continue;
  37.                         }
  38.                         if(j==k){
  39.                                 printf("%3d ",4*(n-2*(k-1))-(i+1-k)-2+p);
  40.                                 continue;
  41.                         }
  42.                                                
  43.                         if(j==n+1-k){
  44.                                 printf("%3d ",n-2*(k-1)+(i-(k-1))-1+p);
  45.                                 continue;
  46.                         }
  47.                         if(i==n+1-k){
  48.                                 printf("%3d ",3*(n-2*(k-1))-(j-(k-1))-1+p);
  49.                                 continue;
  50.                         }
  51.                         printf("  ?");
  52.                         continue;
  53.                

  54.                 }
  55.        
  56.                 printf("\n");
  57.         }
  58. }
  59. }
复制代码
发表于 2002-11-9 12:05:43 | 显示全部楼层

运行结果

Please input a num:1
  1
Please input a num:2
  1   2
  4   3
Please input a num:3
  1   2   3
  8   9   4
  7   6   5
Please input a num:4
  1   2   3   4
12  13  14   5
11  16  15   6
10   9   8   7
Please input a num:5
  1   2   3   4   5
16  17  18  19   6
15  24  25  20   7
14  23  22  21   8
13  12  11  10   9
Please input a num:6
  1   2   3   4   5   6
20  21  22  23  24   7
19  32  33  34  25   8
18  31  36  35  26   9
17  30  29  28  27  10
16  15  14  13  12  11
Please input a num:0
发表于 2002-11-16 13:35:34 | 显示全部楼层

Re: 运行结果

dany兄,能不能解释一下你的算法。

if(i<=n/2)   ...if(j<=n/2)  这里有什么用?


发表于 2002-11-16 17:09:40 | 显示全部楼层
主要是确定打印的是哪一圈
发表于 2004-5-29 20:28:24 | 显示全部楼层
最笨的方法:p但很好用
[php]
/*Redhat linux 9.0*/
#include <stdio.h>
main(void)
{
  int i, j, k, n;
  printf("lease input number: ");
  scanf("%d",&n);
  printf("\\33[2J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\\33[20A");
  for (i=1; i <= n; i++) printf("%5d",i);
  for (k=1, i=n+1;i <= n*n; i++)
     {
       for (j=1; j <= (n-k)&&i <= n*n; j++, i++)
            printf("\\33[1B\\33[5D%5d",i);
       for (j=1; j <= (n-k)&&i <= n*n; j++, i++)
            printf("\\33[10D%5d",i);
       k++;
       for (j=1; j <= (n-k)&&i <= n*n; j++, i++)
            printf("\\33[1A\\33[5D%5d",i);
       for (j=1; j <= (n-k)&&i <= n*n; j++, i++)
            printf("%5d",i);
       k++,i--;/*修正了一下bug:有些值丢失*/
      }
  printf("\\33[20B");
}
[/php]

执行结果:

  1.     1    2
  2.     4    3

  3.     1    2    3
  4.     8    9    4
  5.     7    6    5

  6.                                                                                  
  7.     1    2    3    4    5    6    7    8
  8.    28   29   30   31   32   33   34    9
  9.    27   48   49   50   51   52   35   10
  10.    26   47   60   61   62   53   36   11
  11.    25   46   59   64   63   54   37   12
  12.    24   45   58   57   56   55   38   13
  13.    23   44   43   42   41   40   39   14
  14.    22   21   20   19   18   17   16   15



复制代码
发表于 2004-6-13 13:13:06 | 显示全部楼层
这个算法还是没看懂,等会再仔细看看,有点意思
虽然一看好像很简单,要我编一个还要想半天阿。等会试试
发表于 2004-6-15 22:07:31 | 显示全部楼层
有点难理解,,如果你说个数字出来我要这样人脑排还要排点时间,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表