找回密码
 欢迎注册
楼主: shshsh_0510

[擂台] 打印螺旋方阵

[复制链接]
发表于 2008-9-5 20:43:38 | 显示全部楼层
呵呵
mathe的C学的很精妙啊
什么书上这种细节多?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-6 06:33:03 | 显示全部楼层
我不是从书上学的,基本上都是网络上看的。主要是我接触c语言的时间比较长。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-6 08:59:47 | 显示全部楼层

超过13年了么?



如果没超过,就不叫长

不过,你学的真不错
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-6 10:42:12 | 显示全部楼层
为什么13年?
超过了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-6 14:05:28 | 显示全部楼层
呵呵
92年试图学C
没学成
学的Pascal
工作后,95年学会的
所以说这个

看来你高中就学了C了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-6 15:52:06 | 显示全部楼层
大学才学的。
看来你开始试图学C比我早。
我高中开始学过BASIC,然后大学开始学过FORTRAN,8086汇编,PASCAL.
反而C语言稍微迟一些。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-6 17:35:48 | 显示全部楼层
一样的顺序
呵呵
C的逻辑不如Pascal清晰
语法不如Basic简单
趣味性不如汇编
呵呵

反正一开始看不懂
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-8 09:22:27 | 显示全部楼层
呵呵,大家学的都差不多嘛,而且顺序也都一样,我没学pascal,而是51汇编。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-9 09:30:29 | 显示全部楼层
按照以前的思路,将代码重写了一遍,虽然代码数量依然不及楼主,但是不失为一种很好的算法。
  1. #include "stdio.h"
  2. #define N 8
  3. int main(int argc, char* argv[])
  4. {
  5.         int inc[]={1,0,0,1,-1,0,0,-1};
  6.        
  7.         //inc[0]:表示向右方向x增量
  8.         //inc[0+1]:表示向右方向y增量
  9.        
  10.         //inc[2]:表示向下方向x增量
  11.         //inc[2+1]:表示向下方向y增量
  12.        
  13.         //inc[4]:  表示向左方向x增量
  14.         //inc[4+1]:表示向左方向y增量
  15.        
  16.         //inc[6]:表示向上方向x增量
  17.         //inc[6+1]:表示向上方向y增量

  18.         int        s[N+2][N+2]={0};
  19.         int        i,x,y,d;
  20.         for (i=1;i<=N;i++)
  21.         {
  22.                 s[0][i]=1;   //上边加围墙
  23.                 s[N+1][i]=1; //底边加围墙
  24.                 s[i][0]=1;   //左边加围墙
  25.                 s[i][N+1]=1; //右边加围墙
  26.         }
  27.        
  28.         x=1;
  29.         y=1;
  30.         d=0;        //d表示方向,0:表示向右走,2:表示向下走,4:表示向左走 6:表示向上走
  31.         for (i=1;i<=N*N;i++)
  32.         {
  33.                 s[x][y]=i;
  34.                 if (s[x+inc[d]][y+inc[d+1]]>0) //下一个位置已填充或者是围墙
  35.                 {
  36.                         d+=2;        //改变前进方向
  37.                         d&=7;   //if d>=8,d-=8
  38.                 }
  39.                 x+=inc[d];
  40.                 y+=inc[d+1];
  41.        
  42.         }
  43.         for (y=1;y<=N;y++)
  44.         {
  45.                 for (x=1;x<=N;x++)
  46.                 {
  47.                         printf("%3d",s[x][y]);
  48.                 }
  49.                 printf("\n");
  50.         }
  51.         return 0;
  52. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-9 09:31:43 | 显示全部楼层
// 以下代码重新编排的格式,主要有
// 1.简化了main函数的定义,并且不用return 语句,如在VC中编译,必须保存为c文件,而不是cpp
// 2.采用单字母变量名
// 3.使用等号,将多个赋值语句改为一个赋值语句
// 4.将多个变量定义语句改为1个变量定义语句。
// 5.去掉了对头文件的包含。
// 6.将for语句中的printf("\n")移动for语句括号内,并去除了“{}”
// 7.重新进行了排版,将多行语句排在同一行
// 如果将“#define N 8”去掉,还可以节省几个字符,但失去了灵活性
  1. #define N 8
  2. main()
  3. {
  4. int i=1,x=1,y=1,d=0,s[N+2][N+2]={0},u[]={1,0,0,1,-1,0,0,-1};
  5. for (;i<=N;i++) s[0][i]=s[N+1][i]=s[i][0]=s[i][N+1]=1;
  6. for (i=1;i<=N*N;i++) { s[x][y]=i; if (s[x+u[d]][y+u[d+1]]>0) d=(d+2)&7;        x+=u[d]; y+=u[d+1];        }
  7. for (y=1;y<=N;y++,printf("\n"))        for (x=1;x<=N;x++) printf("%3d",s[x][y]);
  8. }
复制代码

评分

参与人数 1鲜花 +5 收起 理由
shshsh_0510 + 5 学习

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-27 10:39 , Processed in 0.044678 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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