找回密码
 欢迎注册
查看: 25997|回复: 49

[擂台] 打印螺旋方阵

[复制链接]
发表于 2008-9-4 09:57:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
从csdn看到这个,觉得挺有意思:
c/c++ 打印下面的图形,看谁代码最短,只准用标准库
1  2  3  4  5  6  7  8
28  29  30  31  32  33  34  9
27  48  49  50  51  52  35  10
26  47  60  61  62  53  36  11
25  46  59  64  63  54  37  12
24  45  58  57  56  55  38  13
23  44  43  42  41  40  39  14
22  21  20  19  18  17  16  15
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 11:57:38 | 显示全部楼层
可以试着找一个公式。两条对角线将正方形分成四份,首先判断落在哪一份,而对于每个部分,数据分布还是挺规律的,找出公式就可以了。然后再看看这个公式还有没有什么特殊之处可以用来简化程序的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 14:26:03 | 显示全部楼层
模拟填充就可以了
先初始化到0
然后模拟人填充过程
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 14:27:29 | 显示全部楼层
最简单的代码是递归代码
每次只填充一层
我觉得
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 17:19:43 | 显示全部楼层
最简单的代码就是直接一个printf,呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 19:51:12 | 显示全部楼层


我想最好是一重循环做到
最低要求是两重循环
最多50行
不含空行和{, }行
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-4 21:30:58 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define Max 16

  4. int main(void)
  5. {
  6.   int square[Max][Max] = {0};
  7.   int n, num, len, x, y, xp, yp, inc;
  8.   int i, j, k;
  9.   printf("Input n value(n <= 1 exit):");
  10.   scanf("%d", &n);
  11.   printf("\n");
  12.   if (n <= 1) exit(1);
  13.   if (n > Max) n = Max;
  14.   len = n - 1;  num = 1;
  15.   for (i = 0; i < n / 2; i ++)
  16.   {
  17.    x = i; y = i;
  18.    for (j = 1; j <= 4; j ++)
  19.    {
  20.      if (j <= 2) inc = 1; else inc = -1;
  21.      if (j & 1) {xp = 0; yp = inc;} else {xp = inc; yp = 0;}
  22.      for (k = 1; k <= len; k ++)
  23.      {
  24.        square[x][y] = (num ++);
  25.        x += xp;    y += yp;
  26.      }
  27.    }
  28.    len -= 2;
  29.   }
  30.   if (n & 1) square[n/2][n/2] = n * n;
  31.   for (i = 0; i < n; i ++)
  32.   {
  33.    for (j = 0; j < n; j ++)
  34.      printf("%4d", square[i][j]);
  35.    printf("\n");
  36.   }
  37.   return (0);
  38. }
复制代码
在8时候的输出
  1.    1   2   3   4   5   6   7   8
  2.   28  29  30  31  32  33  34   9
  3.   27  48  49  50  51  52  35  10
  4.   26  47  60  61  62  53  36  11
  5.   25  46  59  64  63  54  37  12
  6.   24  45  58  57  56  55  38  13
  7.   23  44  43  42  41  40  39  14
  8.   22  21  20  19  18  17  16  15
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 07:09:30 | 显示全部楼层
更简化的双重循环

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define Max 16

  4. int main(void)
  5. {
  6.   int square[Max][Max] = {0};
  7.   int n, num, len, x, y;
  8.   int i, j;
  9.   printf("Input n value(n <= 1 exit):");
  10.   scanf("%d", &n);
  11.   printf("\n");
  12.   if (n <= 1) exit(1);
  13.   if (n > Max) n = Max;
  14.   len = n - 1;
  15.   num = 1;
  16.   for (i = 0; i < n / 2; i ++)
  17.   {
  18.       x = i; y = i;
  19.       for (j = 0; j < len; j ++)
  20.       {
  21.        square[x][y + j] = num + j;
  22.        square[x + j][y + len] = num + len + j;
  23.        square[x + len][y + len - j] = num + (len << 1) + j;
  24.        square[x + len - j][y] = num + (len << 1) + len + j;
  25.       }
  26.       num += (len << 2);
  27.       len -= 2;
  28.   }
  29.   if (n & 1) square[n/2][n/2] = n * n;
  30.   for (i = 0; i < n; i ++)
  31.   {
  32.           for (j = 0; j < n; j ++)
  33.             printf("%4d", square[i][j]);
  34.           printf("\n");
  35.   }
  36.   return (0);
  37. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-5 10:12:40 | 显示全部楼层
//另一种思路

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define Max 16

  4. int main(void)
  5. {
  6.         int square[Max+2][Max+2] = {0};
  7.         int n, num;
  8.         int i,x, y, xInc,yInc;

  9.         printf("Input n value(n <= 1 exit):");
  10.         scanf("%d", &n);
  11.         printf("\n");
  12.         if (n <= 1) exit(1);
  13.         if (n > Max) n = Max;
  14.        
  15.         for (i=1;i<=n;i++)
  16.         {
  17.                 square[0][i]=-1;        //在四边建立围墙
  18.                 square[i][0]=-1;
  19.                 square[n+1][i]=-1;
  20.                 square[i][n+1]=-1;
  21.         }
  22.         x=y=num=xInc=1;
  23.         yInc=0;
  24.         while (true)
  25.         {
  26.                 square[y][x]=num;
  27.                 if (num==n*n)
  28.                         break;
  29.                 if ( square[y+yInc][x+xInc]!=0) //撞到墙了,或者已填充
  30.                 {
  31.                         switch(xInc*2+yInc+2)
  32.                         {
  33.                                 case 4: xInc=0; yInc=1; break;        //改变方向
  34.                                 case 3: xInc=-1; yInc=0; break;
  35.                                 case 0: xInc=0;yInc=-1; break;
  36.                                 case 1: xInc=1;yInc=0; break;
  37.                         }
  38.                 }
  39.                 x+=xInc;
  40.                 y+=yInc;
  41.                 num++;
  42.         }

  43.         for (y = 1; y <= n; y ++)
  44.         {
  45.                 for (x = 1; x <= n; x++)
  46.             printf("%4d", square[ y ][ x ]);
  47.                 printf("\n");
  48.         }
  49.         return (0);
  50. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-5 11:25:35 | 显示全部楼层
我也抛个砖,不过好像打反了,实在懒得改了,不知有没有哪位能突破直接打印!
#include <iostream>
#include <math.h>
using namespace std;
int  i,j,t,p,q,z,data[8][8];
void test2()
{
        #define r(x) (int)(x>0?x+.5:x-.5)
        #define O(x,n,k) r(1.4*n*x(0.78*k/n))
        #define g(n,k,x) (abs(x)<n?x:n*x/abs(x))+3
        for(i=1;i<64;i++) {        p=sqrt(i);t=p%2?(p+1)/2:p/2;z=i-4*t*t+3*t;
        data[g(t,z,O(sin,t,z))][g(t,z,O(cos,t,z))]=i;}
        for(i=0;i<8;i++){for(int j=0;j<8;j++) cout<<"\t"<<64-data[i][j];cout<<endl;}
}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-25 20:29 , Processed in 0.068380 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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