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

[擂台] 打印螺旋方阵

[复制链接]
发表于 2008-9-11 08:25:12 | 显示全部楼层
11#是将1-64映射为(x,y)的方法,但是如果写出逆映射,应该可以好一些
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-11 09:31:41 | 显示全部楼层
其实那个方法更复杂一些,需要仔细调节周期和幅度,使得各角度落在各整数区间,那两个系数俺可是算了好一会,我想看看有没更简洁的一些公式
我那个公式本质是先求出某点到中心的距离,即所在圈数,然后用极坐标表示。调解周期和幅度,使2*PIk 在各k<N/2 时位于各整数区间。
但该方法用到较多数学函数,尤其vc6没有round函数,所以效果不是很好
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-11 09:42:27 | 显示全部楼层
哎,不经意间搜到的
我以为大家都能搜索到呢
可是刚才我也搜索不到了

那个算法是把方阵当作一维数组填充的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-12 09:10:27 | 显示全部楼层
没事再来个windows直接写屏的

  1. #include <windows.h>
  2. p(int x,int y,int n){COORD p={3*x,y};SetConsoleCursorPosition(GetStdHandle(-11),p);printf("%d",n);}
  3. test(){
  4.     int i=5,j,t,r;for(;i<9;i++){r=2*i-9;t=r*r;p(i,i,t);for(j=r;j>=1;j--){p(i,i-j,t-j);p(i-j,i,t+j);p(9-i,i-j,t+r+j);p(i-j+1,9-i,t-r-j+1);}}
  5. }
复制代码
由于win32超长的函数名,而且还得include <windows.h>所以比直接for一下还长,但如果有个gotoxy之类的简单函数,估计会好一些
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-7 14:42:39 | 显示全部楼层
8*8太小了,直接打印如果编一下码,那种按规律的就不他可能超过了,比如最简单的,用asc码编一下:

  1. void test()
  2. {
  3.         int i=1;char a[]="'()*+,-./CDEFGHI0BWXYZ[J1AVcde\\K2@Ubgf]L3?Ta\`_^M4>SRQPON5=<;:9876";
  4.         for(;i<65;i++)printf("%2d%c",a[i]-39,(i%8)?0:10);
  5. }
复制代码
最短能多短?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-7 15:05:05 | 显示全部楼层
还可以模仿那个“helloworld”程序,将字符串用__FILE__代替,不过需要比较小心的选择编码,我这选择的编码方案中出现了windows文件名中的限制字符,所以不成,哪位有兴趣可以试试
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-7 15:27:04 | 显示全部楼层
呵呵,糊涂了,用文件名就没必要编码了,直接把文件叫做:
1  2 3  ......  16  15.cpp
文件内容为
  1. main(){for(int i=1;i<192;i++)printf("%c",(i%24)?__FILE__[i+62]:10);}
复制代码
即可
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-7 16:05:54 | 显示全部楼层
刚试了一下,我为了对齐好算回车的位置,单位数间都隔2个空格,双位数隔一个空格,文件名居然又超过了windows的限制,最后是这样:

  1. void test2(){
  2.         for(int i=1;i<186;i++)printf("%c",(i%24)?__FILE__[i+62]:10);
  3.         printf(" 16 15\n");
  4. }
复制代码
最后两个额外打出
还能再短点么?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-7 19:18:47 | 显示全部楼层
原帖由 shshsh_0510 于 2008-10-7 16:05 发表
刚试了一下,我为了对齐好算回车的位置,单位数间都隔2个空格,双位数隔一个空格,文件名居然又超过了windows的限制,最后是这样:
void test2(){
        for(int i=1;i


呵呵,打印的字符都用文件名了,虽然不违规,但也够变态的,文件名这么长,让人看着不舒服。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-7 20:05:22 | 显示全部楼层
连文件名这种外围的东西都利用起来,
说明楼主对这个问题想得很深入,
当然功底自是没得说,更叫绝的是这种创造力!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-24 06:04 , Processed in 0.045323 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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