蛇形填数

来源:互联网 发布:linux内核启动 编辑:程序博客网 时间:2024/05/17 10:05

唉!

晒网晒了三天了吧,打渔吧 - -!

师父放假过他自己私生活去了,不忍打扰啊 - -!

 

自己写的代码和书上的差距还是很大的   啊

 

蛇形填数啊

题在书上粘不过来哈哈

哈哈,补上

例3-2蛇形填数。

在n*n方阵里填入1,2,…,n*n,要求填成蛇形。例如n=4时方阵为

10    11   12   1

9    16   13   2

8    15   14   3

7     6    5   4

上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n≤8。

【分析】

与数学的矩相比,可以用一个所谓的二维数组来存储题目中的方阵。只需声明一个int a[MAXN][MAXN],就可以获得一个大小为MAXN×MAXN的方阵。在声明时,两维的大小不必相同。

 

 

自己的糙代码:

#include<stdio.h>int main(){int n,a[10][10],i,j,k,m;while(scanf("%d",&n)!=EOF){k=1,j=n-1;for(m=0;m<=n/2-1;++m){            for(i=m;i<=n-m-2;++i)    {a[i][j]=k; ++k; }    for(j=i;j>=m+1;--j)    {a[i][j]=k; ++k; }    for(;i>=m+1;--i)    {a[i][j]=k; ++k; }    for(;j<=n-m-2;++j)    {a[i][j]=k; ++k; }    j-=1;}    if(n%2==1) a[n/2][n/2]=k;for(i=0;i<n;++i){for(j=0;j<n;++j)printf("%6d",a[i][j]);printf("\n");}}return 0;}


 

 


书上给的:

#include<stdio.h>#include<string.h>#define MAXN 10int a[MAXN][MAXN];int main(){  int n, x, y, tot = 0;  scanf("%d", &n);  memset(a, 0, sizeof(a));  tot = a[x=0][y=n-1] = 1;  while(tot < n*n) {    while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;    while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;    while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;    while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;  }  for(x = 0; x < n; x++) {    for(y = 0; y < n; y++) printf("%3d", a[x][y]);    printf("\n");  }  return 0;}

 

 

学到了什么:

1.比较大的数组应尽量声明在main函数外;

2.数组清零

memset(a,0,sizeof(a));

3.简洁而不牺牲可读性

tot = a[x=0][y=n-1] = 1;

4.唉,善用宏定义吗

#define MAXN 10

5.    a[x+1][y]==0 简写成 !a[x+1][y]

 

就这样吧
改天再说

原创粉丝点击