找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 60068|回复: 37

【出题】批处理输出n阶幻方

[复制链接]
发表于 2009-4-1 12:50:36 | 显示全部楼层 |阅读模式
所谓n阶幻方:1-n^2个数排为n行n列,横、竖、对角线相加和相同。
  输入:幻方阶数n (暂限制为奇数阶)
  输出:n行n列的方阵,横、竖、对角线相加和相同。
  举例:5阶幻方,横、竖、对角线相加和为65
17 24  1  8 15
23  5  7 14 16
4  6 13 20 22
10 12 19 21  3
11 18 25  2  9
发表于 2009-4-1 13:53:17 | 显示全部楼层
这个题目相当难啊~ 以前做过类似的,没做出来~ - -|||
发表于 2009-4-1 15:11:53 | 显示全部楼层
解此题最重要的不是代码,而是思路。。。
 楼主| 发表于 2009-4-1 16:56:40 | 显示全部楼层
恩,幻方生成规则知道了,代码也就不难了。^_^
 楼主| 发表于 2009-4-1 20:02:43 | 显示全部楼层
是不是太难了,怎么没人贴代码来?可以先到网上搜索一下奇次幻方的构造规律,然后再转化为代码就相对容易些了!
发表于 2009-4-1 21:08:44 | 显示全部楼层
是想自己摸索出来那个规则吧?
发表于 2009-4-1 22:30:27 | 显示全部楼层
cn-dos不是有么
 楼主| 发表于 2009-4-1 22:56:37 | 显示全部楼层
哦?我刚搜了下没搜到啊。slore兄不妨把那帖子链接贴来,看能不能激发些灵感想出些不同的方法。
发表于 2009-4-1 23:27:59 | 显示全部楼层
不知道slore兄是不是说的这个:
http://www.cn-dos.net/forum/viewthread.php?tid=26647

CN-DOS这次出问题看来丢了十来天的数据,哎~
 楼主| 发表于 2009-4-2 06:47:07 | 显示全部楼层
呵,我发现什么帖子都逃不过batcher的眼睛啊~此链接中楼主所说的九宫格就是三阶幻方,又看到了namejm的精彩代码~~不过此题要求是n阶幻方(暂定为奇数阶),下面11楼 pengfei所上传的附件sigil.exe符合此题题意。虽然没提供代码,但是提供了算法。大家尝试着看谁能写出代码?
发表于 2009-4-2 10:19:00 | 显示全部楼层
试试:
  1. @echo off
  2. :bgn
  3. set input=&set /p input=请输入3以上的单数(回车退出):
  4. if not defined input goto :eof
  5. cls
  6. if %input% lss 3 (echo.你输入的也太小了吧...&goto :bgn)
  7. echo.%input:~-1%|findstr "[^13579]" >nul&&(echo.请输入单数...&goto :bgn)
  8. set /a num1=(%input%*%input%+1)*%input%/2,num2=%input%*%input%
  9. echo.%input%阶幻方各行,列以及对角线相加的和为:%num1%
  10. set /a lie=%input%/2+1,hang=1,all=1
  11. set h1l%lie%=1
  12. :agn
  13. set /a hang-=1,lie+=1,all+=1
  14. if %hang% lss 1 set hang=%input%
  15. if %lie% gtr %input% set lie=1
  16. if defined h%hang%l%lie% (set /a hang+=2,lie-=1)
  17. set h%hang%l%lie%=%all%
  18. if "%hang%"=="1" (
  19.   if "%lie%"=="%input%" (
  20.     set /a hang+=1,all+=1
  21.     call set h%%hang%%l%lie%=%%all%%
  22.   )
  23. )
  24. if %all% equ %num2% goto :show
  25. goto :agn
  26. :show
  27. for /l %%a in (1 1 %input%) do (
  28.   for /l %%b in (1 1 %input%) do (
  29.     call set/p=%%h%%al%%b%%  <nul
  30.     set "h%%al%%b="
  31.   )
  32.   echo.
  33. )
  34. goto :bgn
复制代码

评分

参与人数 2PB +28 收起 理由
523066680 + 20
lhjoanna + 8 不错,还有些小建议在楼下~

查看全部评分

发表于 2009-4-2 16:19:30 | 显示全部楼层

我试试,化了一节课的时间才做出来的



  1. program aa;
  2. var
  3. i,j,m,n:integer;
  4. a:array [1..100,1..100] of integer;
  5. begin
  6. repeat
  7. readln(n);
  8. m:=n mod 2;
  9. until m<>0;
  10. for i:=1 to n do
  11.   for j:=1 to n do a[i][j]:=0;
  12. i:=2;j:=n div 2;
  13. for m:=1 to n*n do
  14. begin
  15.   i:=i-1;j:=j+1;
  16.   if (i=0) and (j<>n+1) then  i:=n;
  17.   if (j=n+1) and (i<>0) then j:=1;
  18.   if (a[i][j]<>0) or (i=0) and (j=n+1) then
  19.   begin
  20.     i:=i+2;
  21.     j:=j-1;
  22.   end;
  23.   a[i][j]:=m;
  24. end;
  25. for i:=1 to n do
  26.   begin
  27.   for j:=1 to n do
  28.    write(a[i][j]:5);
  29.   writeln;
  30.   end;
  31. end.

复制代码

[ 本帖最后由 tyc 于 2009-4-2 16:20 编辑 ]

评分

参与人数 1PB +5 收起 理由
lhjoanna + 5 希望也能用批来实现~

查看全部评分

 楼主| 发表于 2009-4-2 18:43:36 | 显示全部楼层
Re:more
      结果符合幻方的要求,代码也不错,在此基础上提些小建议(供参考):
   1、对于大于3的要求我觉得不必,因为1阶幻方也是幻方,只不过所含的元素只有一个而已,可以统一起来考虑;
   2、对于输入的限制,兄所用的方法是判断最后一位是否奇数,对于要求不高的情况可以满足,但如果要求苛刻些,比如输入a3、12a5等情况,可能会出错。最好还是用完全匹配来限制输入;
   3、对于算法的实现,我没有仔细的验证,应该没问题,毕竟结果正确,并且也符合了行++,列- -,到边的话首尾相接,元素已存在的话放到正下方 等规则;
   4、输出结果正确,再加上对齐就完美了。^_^

Re:tyc
      不知兄用的什么语言,我还真没用过,不过我基本看懂了,一些语法的问题我就无从知晓了,不过算法是正确的。其实对于输出幻方来说,实现起来这样的高级语言比批处理容易些,因为数组类型是内置的,而批处理则需要自己构建一个类似的二维数组来方便操作;此题要求是用批处理来实现,所以希望兄闲暇时也考虑下用批处理来实现~不管怎么说,毕竟动了一番脑子,加分鼓励^_^
发表于 2009-4-2 19:52:04 | 显示全部楼层
应版主的要求,再做一些修改吧:
  1. @echo off
  2. :bgn
  3. set input=&set /p input=请输入一个单数(回车退出):&cls
  4. if not defined input goto :eof
  5. echo.%input%|findstr /v "^[0-9]*$" >nul&&(echo.请输入纯数字!!!&goto :bgn)
  6. echo.%input:~-1%|findstr "[^13579]" >nul&&(echo.请输入单数!!!&goto :bgn)
  7. set /a num1=(%input%*%input%+1)*%input%/2,num2=%input%*%input%
  8. echo.%input%阶幻方各行,列以及对角线相加的和为:%num1%&echo.
  9. set /a lie=%input%/2+1,hang=1,all=1
  10. if %num2% gtr 99 (set h1l%lie%=  1) else (set h%hang%l%lie%= 1)
  11. :agn
  12. set /a hang-=1,lie+=1,all+=1
  13. if %hang% lss 1 set hang=%input%
  14. if %lie% gtr %input% set lie=1
  15. if defined h%hang%l%lie% (set /a hang+=2,lie-=1)
  16. call :duiqi
  17. if "%hang%"=="1" (
  18.   if "%lie%"=="%input%" (
  19.     set /a hang+=1,all+=1
  20.     call :duiqi
  21.   )
  22. )
  23. if %all% geq %num2% goto :show
  24. goto :agn
  25. :show
  26. for /l %%a in (1 1 %input%) do (
  27.   for /l %%b in (1 1 %input%) do (
  28.     call set/p=%%h%%al%%b%%  <nul
  29.     set "h%%al%%b="
  30.   )
  31.   echo.&echo.
  32. )
  33. goto :bgn
  34. :duiqi
  35. if %num2% gtr 99 (
  36.   if %all% lss 10 (
  37.     set h%hang%l%lie%=  %all%
  38.   ) else (
  39.     if %all% lss 100 (
  40.       set h%hang%l%lie%= %all%
  41.     ) else (
  42.       set h%hang%l%lie%=%all%
  43.     )
  44.   )
  45. ) else (
  46.   if %num2% gtr 9 (
  47.     if %all% lss 10 (
  48.       set h%hang%l%lie%= %all%
  49.     ) else (
  50.       set h%hang%l%lie%=%all%
  51.     )
  52.   ) else (set h%hang%l%lie%= %all%)
  53. )
复制代码
发表于 2009-4-2 20:35:11 | 显示全部楼层

兄弟不才,用了其它语言

我用pascal,批处理写不出来,一急就用其它高级语言了,不过这一题是初中生的竞赛题。

[ 本帖最后由 tyc 于 2009-4-3 07:34 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:05 , Processed in 0.019112 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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