奇数阶幻方

编制奇数阶幻方的方法

问题如:http://community.csdn.net/Expert/topic/5698/5698866.xml?temp=.1421167

简单描述:给 1 - 9,9个数,摆放成 3 * 3 的矩阵,
要求每横排,每竖排,对角线 上 3个数字相加均为15。其中矩阵也可为5*5,7*7等等。

算法如下:http://210.77.218.4:8080/RESOURCE/XX/XXSX/SXBL/BL000071/11936_SR.HTM

    在奇数阶方阵最上边一行当中填上1,以后随着在1的斜上方填上2、3…假如所填数字出了方阵,那就把它移进行方中,移动的原则是上移下,左移右。例如把2移到4列的最下边,由2再斜右向上填3,因为4又越出了方阵,于是再把它移入第一列第3行中。从4起再右上填5,但在填6时,因为1已占3那个小方格。遇此情况,就把6填在5的下边,再右斜向上填7、8、9,因为9又越出幻方,再把它移到末行。斜右上填10,10越出幻方,就移到第一列…这样,填满小方格,就编出一个幻方,如图3-10所示。

根据这个算法,我编写了如下代码,不是很简洁

            static   void  Main( string [] args)
           
{
            
const int N = 5;
            
int[,] data = new int[N,N];

            
int i = 0;
            
int j = N / 2;
            
for (int k = 0; k < N * N; k++)
            
{
                
if (data[i, j] >= k || data[i, j] == 0)
                
{
                    data[i, j] 
= k + 1;
                }

                
else
                
{
                    i 
= Mod(i + 2, N);
                    j 
= Mod(j - 1, N);
                    data[i, j] 
= k + 1;
                }

                i 
= Mod(i - 1, N);
                j 
= Mod(j + 1, N);
            }

            
for (i = 0; i < N; i++)
            
{
                
for (j = 0; j < N; j++)
                    Console.Write(
"{0} ", data[i, j]);
                Console.WriteLine();
            }

      }


        
static   int  Mod( int  i,  int  j)
        
{
            
if (i >= 0)
                i 
= i % j;
            
else
                i 
= (i + j) % j;
            
return i;
        }
简单说明一下,实现该算法并不困难,关键在于理解循环队列的相关结构。其中Mod函数就是用来定位数组下标。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值