回 帖 发 新 帖 刷新版面

主题:求一段代码

如题 求一段代码 要求从1到n的平方顺时针打印出 比如1  2  3
                                                 8  9  4   
                                                 7  6  5

回复列表 (共3个回复)

沙发

#include <stdio.h>
#define MAX 100
int num[MAX][MAX];
int st[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

int main()
{
    int n,n2,i,j,k,a;

    scanf("%d",&n);
    n2 = n * n;
    for(i = 0;i <= n + 1;i++)
        for(j = 0;j <= n + 1;j++)
            if(i == 0 || j == 0 || i == n + 1 || j == n + 1)
                num[i][j] = -1;
    for(k = 1,i = 1,j = 1,a = 0;k <= n2;k++)
    {
        num[i][j] = k;
        i += st[a][0];
        j += st[a][1];
        if(num[i][j] != 0)
            {
                i -= st[a][0];
                j -= st[a][1];
                a++;
                if(a > 3) a = 0;
                i += st[a][0];
                j += st[a][1];
            }
    }
    for (i = 1;i <= n ;i++)
    {
        for(j = 1;j <= n ;j++)
            printf("%4d",num[i][j]);
        printf("\n\n");
    }
}

板凳

谢谢哈

3 楼

1楼的方法不错。把输出的数据看成平面坐标的话,主要依据横坐标x的增量为1,0,-1,0(循环),纵坐标y的增量为0,1,0,-1(循环)。

其实也可以按圈来填充数据。比如说n=4,首先填充最外圈
(top )1  2  3  4(right)
      12       5        然后   (top )13  14(right)
      11       6               (left)16  15(bottom)
(left)10 9  8  7(bottom), 
对于每填充一圈,把四个角分别称为top(顶) right(右) bottom(底) left(左)
然后 从top向右 从bottom向左 从right向下 从left向上 四个方向同时填充数据。
如果知道top的坐标和对应的值,很容易把这一圈全部填完。
这里面还有很多隐藏的规律,如 顶行与底行之和 左行与右行之和 都是定值。下面的代码可稍做优化。
[code=c]
#include <stdio.h>

#define FOO 100

int main ( void )
{
  int i, j; 
  int n, xl, xr;
  int a [FOO] [FOO];
  int left, right, top, bottom;
  
  scanf ( "%d", &n );
  xl   = 0;                           /* 最左上的坐标为(xl,xl) */ 
  xr   = n - 1;                       /* 最右下的坐标为(xr,xr) */ 
  left = 1; 
  
  for ( ; xr > xl; xl++ , xr-- ) 
    {
    int walk = xr - xl;        
    int ytop = xl, ybottom = xr;      /* 顶部和底部坐标的y值 */
    int xleft = xr, xright = xl;      /* 左部和右部坐标的x值 */ 
    
    top  = left;                     /* top对应的值 */                       
    right = left + 1 * walk;                 
    bottom = left + 2 * walk;                
    left    = left + 3 * walk;               
 
    while ( ytop < xr )
      {
      a [xl] [ ytop++  ] = top ++;           /* 从top向右    */
      a [xr] [ybottom--] = bottom ++;        /* 从bottom向左 */
      a [xleft-- ] [xl]  = left ++;          /* 从left向上   */
      a [xright++] [xr]  = right ++;         /* 从right向下  */
      }
    }

  if ( xl == xr )                 /* 如果n是奇数,最后一个数n*n */
    a [xr] [xr] = n * n;                 


  for ( i = 0; i < n ; i++ ) {   /* 输出 */
    for ( j = 0; j < n ; j++ )
        printf ( "%4d ", a [i] [j] );  
    printf ( "\n\n" );
  }         

  return 0;
}[/code]

我来回复

您尚未登录,请登录后再回复。点此登录或注册