• N阶幻方


    N阶幻方,思路如下:

    把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n*n-1个数: 
    (1)、每一个数放在前一个数的右上一格;
    (2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列; 
    (3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
    (4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内; 
    (5)、如果这个数所要放的格已经有数填入,处理方法同(4)。

     1 #include "stdafx.h"
     2 #include <stdlib.h>
     3 const int Max = 100;
     4 int k;//游标K
     5 
     6 //排列N阶数组
     7 void Rank(int  x[Max][Max],int r, int c,int n)
     8 {
     9     //放置第一个值
    10     x[r][c] = 1;
    11     for(k = 2; k <= n*n; k++)
    12     {
    13         //游标右上方向移一次。
    14         r--;
    15         c++;
    16         //超出顶行但未超出右列
    17         if(r < 0 && c< n)
    18         {
    19             r = n - 1;
    20             x[r][c] = k;
    21             continue;
    22         }
    23         //超出右列但未超出顶行
    24         if(r >= 0 && c > n - 1)
    25         {
    26             c =  0;
    27             x[r][c] = k;
    28             continue;
    29         }
    30         //超出顶行且超出右列
    31         if(r < 0 && c > n - 1)
    32         {
    33             //恢复前一个数的位置
    34             r++;
    35             c--;
    36             //下移一行
    37             r = r + 1;
    38             x[r ][c] = k;
    39             continue;
    40         }
    41         //如果有数
    42         if(x[r][c] != 0)
    43         {
    44             //恢复前一个数的位置
    45             r++;
    46             c--;
    47             //下移一行
    48             r = r + 1;
    49             x[r][c] = k;
    50             continue;
    51         }
    52         else
    53             x[r][c] = k;
    54     }
    55     
    56     //幻方建立完毕,开始输出
    57     for(int s = 0;s < n;s++)
    58     {
    59         for(int l = 0; l < n; l++)
    60         {
    61             printf("%4d",x[s][l]);
    62         }
    63         printf("
    ");
    64     }
    65 }
    66 
    67 
    68 int _tmain(int argc, _TCHAR* argv[])
    69 {    
    70     //初始化一个二维数组
    71     int m[Max][Max] = {0};
    72     //定义初始行列值
    73     int r ,c;
    74     //幻方阶数
    75     int n;
    76     printf("请输入幻方阶数:");
    77     scanf("%d",&n);
    78     //判断阶数是不是奇数
    79     while(n % 2 == 0)
    80     {
    81         printf("输入的幻方阶数不对,请重新输入幻方阶数:");
    82         scanf("%d",&n);    
    83     }
    84     //获得初始行列值
    85     r = 0;
    86     c = n / 2;
    87     //排列幻方
    88     Rank(m,r,c,n);
    89     system("Pause");
    90     return 0;
    91 }
  • 相关阅读:
    Azure Queues and Service Bus Queues
    同步消息队列模型
    ADO.NET Asynchronous Programming
    js中cookie
    字符串格式化命令 sprintf
    JS的Touch事件们,触屏时的js事件
    imac上php环境php+apache+mysql
    日历js插件
    html_entity_decode 函数 编辑器输出之显示含html为转义 thinkphp
    thinkphp自定义权限管理之名称判断
  • 原文地址:https://www.cnblogs.com/baikequanshu/p/3491525.html
Copyright © 2020-2023  润新知