免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1304 | 回复: 1
打印 上一主题 下一主题

一个数学问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-18 11:33 |只看该作者 |倒序浏览
怎样构造纵横图?(将n*n个数放入N*N的正方形,让它纵,横,斜相加都相等)
当n是奇数时,参考书上已经告诉了怎样构造纵横图.
当n是偶数时,怎样构造?

论坛徽章:
0
2 [报告]
发表于 2006-04-18 21:15 |只看该作者

  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <iomanip>
  5. #include <cassert>

  6. using namespace std;

  7. void MagicSquare_DoubleEven(int n);
  8. void MagicSquare_SingleEven(int n);
  9. void MagicSquare_Odd(int n);
  10. int Mode(int Nbr, int Mod);

  11. class cell
  12. {
  13. public:
  14.         int  Nbr;
  15.         bool Is_Empty;
  16. };

  17. class unit
  18. {
  19. public:
  20.         int  Nbr;
  21.         char tag;
  22.         bool Is_Empty;
  23. };

  24. int main()
  25. {
  26.         cout << "Input the number of row" << endl;
  27.         int n;
  28.         cin >> n;

  29.         if (n <= 0)
  30.         {
  31.                 cerr << "Invalid because " << n << " <= 0" << endl;
  32.                 exit(1);
  33.         }

  34.         else if(n % 2 == 1)
  35.                 MagicSquare_Odd(n);
  36.        
  37.         else if (n % 4 == 0)
  38.                 MagicSquare_DoubleEven(n);

  39.         else
  40.                 MagicSquare_SingleEven(n);
  41.        
  42.         return 0;
  43. }

  44. void MagicSquare_DoubleEven(int n)
  45. {
  46.         vector< vector<int> > Square(n);
  47.         int r, c, value = 1;
  48.        
  49.         for (r = 0; r < n; ++r)
  50.         {
  51.                 Square[r].resize(n);
  52.                 for (c = 0; c < n; ++c, ++value)
  53.                 {
  54.                         Square[r][c] = value;
  55.                 }
  56.         }

  57.         int m = n/4;
  58.         int i, j;
  59.         int rd = 0;
  60.         int cd = 0;

  61.         for (i = 0; i < m; ++i)
  62.         {
  63.                 for (j = 0; j < m; ++j)
  64.                 {
  65.                         rd = (i-0)*4;
  66.                         cd = (j-0)*4;
  67.                         for (r = rd; r<rd+4; ++r)
  68.                           for (c = cd; c<cd+4; ++c)
  69.                                 if ((r-rd == c-cd) || (r-rd+c-cd==3))
  70.                                    Square[r][c] = n*n+1-Square[r][c];
  71.                 }
  72.         }

  73.         for (r = 0; r < n; ++r)
  74.         {
  75.                 for (c = 0; c < n; ++c)
  76.                 {
  77.                         cout << setw(3) << Square[r][c] << " ";
  78.                 }
  79.                 cout << endl;
  80.         }
  81. }

  82. void MagicSquare_SingleEven(int n)
  83. {
  84.         int m = (n-2)/4;

  85.         vector< vector<unit> > LUX(2*m+1);
  86.         unit Inlitial = {0, 'L', true};
  87.         int i;
  88.         for (i = 0; i < m+1; ++i)
  89.                 LUX[i].resize(2*m+1,Inlitial);

  90.         Inlitial.tag = 'U';
  91.         LUX[i].resize(2*m+1,Inlitial);

  92.         Inlitial.tag = 'X';
  93.         for (i = m+2; i < 2*m+1; ++i)
  94.                 LUX[i].resize(2*m+1, Inlitial);
  95.        
  96.         char ctemp = LUX[m][m].tag;
  97.         LUX[m][m].tag = LUX[m+1][m].tag;
  98.         LUX[m+1][m].tag = ctemp;

  99.         int r;
  100.         vector< vector<int> > Square(n);
  101.         for (r = 0; r < n; ++r)
  102.                 Square[r].resize(n, 0);
  103.        
  104.         // much like MagicSquare_Odd
  105.         r = 0;
  106.         int c = m;
  107.         int tem_r, tem_c;
  108.         int value = 1;
  109.         LUX[r][c].Nbr = 1;
  110.         LUX[r][c].Is_Empty = false;


  111.        
  112.         Square[2*r][2*c+1] = value++;
  113.         Square[2*r+1][2*c] = value++;
  114.         Square[2*r+1][2*c+1] = value++;
  115.         Square[2*r][2*c] = value++;

  116.         for (int step = 2; step < (2*m+1)*(2*m+1)+1; ++step)
  117.         {
  118.                 tem_r = Mode(r-1, 2*m+1);
  119.                 tem_c = Mode(c+1, 2*m+1);

  120.                 if (LUX[tem_r][tem_c].Is_Empty)
  121.                 {
  122.                         LUX[tem_r][tem_c].Nbr = step;
  123.                         LUX[tem_r][tem_c].Is_Empty = false;
  124.                         r = tem_r;
  125.                         c = tem_c;
  126.                 }
  127.                
  128.                 else
  129.                 {
  130.                         r = Mode(r+1, 2*m+1);
  131.                         LUX[r][c].Nbr = step;
  132.                         LUX[r][c].Is_Empty = false;
  133.                 }

  134.                 ctemp = LUX[r][c].tag;  
  135.                 switch(ctemp)
  136.                 {
  137.                         case 'L':
  138.                                 Square[2*r][2*c+1] = value++;
  139.                                 Square[2*r+1][2*c] = value++;
  140.                                 Square[2*r+1][2*c+1] = value++;
  141.                                 Square[2*r][2*c] = value++;
  142.                                 break;
  143.                         case 'U':
  144.                                 Square[2*r][2*c] = value++;
  145.                                 Square[2*r+1][2*c] = value++;
  146.                                 Square[2*r+1][2*c+1] = value++;
  147.                                 Square[2*r][2*c+1] = value++;
  148.                                 break;
  149.                         case 'X':
  150.                                 Square[2*r][2*c] = value++;
  151.                                 Square[2*r+1][2*c+1] = value++;
  152.                                 Square[2*r+1][2*c] = value++;
  153.                                 Square[2*r][2*c+1] = value++;
  154.                                 break;
  155.                         default:
  156.                                 cerr << "There is something wrong" << endl;
  157.                                 exit(1);
  158.                 }
  159.         }       
  160.         for (r = 0; r < n; ++r)
  161.         {
  162.                 for (c = 0; c < n; ++c)
  163.                 {
  164.                         cout << setw(3) << Square[r][c] << " ";
  165.                 }
  166.                 cout << endl;
  167.         }
  168. }

  169. void MagicSquare_Odd(int n)
  170. {
  171.         vector< vector<cell> > Square(n);
  172.         cell Inlitial = {0, true};

  173.         int r;
  174.         for (r = 0; r < Square.size(); ++r)
  175.                 Square[r].resize(n, Inlitial);       

  176.         r = 0;
  177.         int c = (n-1)/2;
  178.         int tem_r, tem_c;
  179.         Square[r][c].Nbr = 1;
  180.         Square[r][c].Is_Empty = false;

  181.         for (int step = 2; step < n*n+1; ++step)
  182.         {
  183.                 tem_r = Mode(r-1, n);
  184.                 tem_c = Mode(c+1, n); // difference

  185.                 if (Square[tem_r][tem_c].Is_Empty)
  186.                 {
  187.                         Square[tem_r][tem_c].Nbr = step;
  188.                         Square[tem_r][tem_c].Is_Empty = false;
  189.                         r = tem_r;
  190.                         c = tem_c;
  191.                 }
  192.                
  193.                 else
  194.                 {
  195.                         r = Mode(r+1, n);
  196.                         Square[r][c].Nbr = step;
  197.                         Square[r][c].Is_Empty = false;
  198.                 }
  199.         }

  200.         for (r = 0; r < Square.size(); ++r)
  201.         {
  202.                 for (c = 0; c < Square.size(); ++c)
  203.                 {
  204.                         cout << setw(3) << Square[r][c].Nbr << " ";
  205.                 }
  206.                 cout << endl;
  207.         }
  208. }

  209. int Mode(int Nbr, int Mod)
  210. {
  211.         assert(Mod);
  212.         int tem = abs(Nbr);
  213.         tem /= Mod;

  214.         if (Nbr >= 0)
  215.                 Nbr = Nbr % Mod;
  216.        
  217.         else
  218.                 Nbr = Nbr + (tem+1)*Mod;

  219.         return Nbr;
  220. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP