[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

所谓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

这个题目相当难啊~ 以前做过类似的,没做出来~ - -|||
心绪平和,眼藏静谧。

TOP

解此题最重要的不是代码,而是思路。。。
***共同提高***

TOP

恩,幻方生成规则知道了,代码也就不难了。^_^

TOP

是不是太难了,怎么没人贴代码来?可以先到网上搜索一下奇次幻方的构造规律,然后再转化为代码就相对容易些了!

TOP

是想自己摸索出来那个规则吧?
Still with wax

TOP

cn-dos不是有么

TOP

哦?我刚搜了下没搜到啊。slore兄不妨把那帖子链接贴来,看能不能激发些灵感想出些不同的方法。

TOP

不知道slore兄是不是说的这个:
http://www.cn-dos.net/forum/viewthread.php?tid=26647

CN-DOS这次出问题看来丢了十来天的数据,哎~
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

呵,我发现什么帖子都逃不过batcher的眼睛啊~此链接中楼主所说的九宫格就是三阶幻方,又看到了namejm的精彩代码~~不过此题要求是n阶幻方(暂定为奇数阶),下面11楼 pengfei所上传的附件sigil.exe符合此题题意。虽然没提供代码,但是提供了算法。大家尝试着看谁能写出代码?

TOP

试试:
  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
复制代码
2

评分人数

TOP

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

  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 编辑 ]
1

评分人数

    • lhjoanna: 希望也能用批来实现~PB + 5

TOP

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

Re:tyc
      不知兄用的什么语言,我还真没用过,不过我基本看懂了,一些语法的问题我就无从知晓了,不过算法是正确的。其实对于输出幻方来说,实现起来这样的高级语言比批处理容易些,因为数组类型是内置的,而批处理则需要自己构建一个类似的二维数组来方便操作;此题要求是用批处理来实现,所以希望兄闲暇时也考虑下用批处理来实现~不管怎么说,毕竟动了一番脑子,加分鼓励^_^

TOP

应版主的要求,再做一些修改吧:
  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. )
复制代码

TOP

兄弟不才,用了其它语言

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

[ 本帖最后由 tyc 于 2009-4-3 07:34 编辑 ]

TOP

返回列表