魔术矩阵是一个n*n的矩阵,其中N必须为奇数,然后将1至n的平方的整数依照指定的规则放入矩阵,完成后矩阵的各行各列以及对角线的元素值总和均会相同。
放置规则,第一个整数1一律被放置在第一行的中间位置,第二个值得位置必须放置在第一个值得左上角,因此,由1的位置往左一格,再往上一格,此时超出数组的范围,因此回到同一列的最下方。
同样,3必须放在2的左上角,4放在3的左上角,此时超出数组范围回到同一行的最右边空格。同此规则,来到5的位置,当我们要填入6的时候,其位置
已被数字1占据,因此将其放置到5的下方,接下来的数字则依规则一一放置到合适的位置,当填到15的时候,其左方与上方均没有位置,因此下一个数直接放置
于15的下方,完成了填入16的值,接下来的数目,均可以依上述的规则填写完成。
下面看看这个魔术矩阵的示例代码:
/*此类是主窗口,接受输入的奇数
MagicSquare.cs
*/
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace MagicSquare
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class MagicSquare : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Label lblNumber;
private System.Windows.Forms.TextBox txbNumber;
private System.Windows.Forms.Button btnOK;
public int number=0;
public MagicSquare()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.lblNumber = new System.Windows.Forms.Label();
this.txbNumber = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// lblNumber
//
this.lblNumber.Location = new System.Drawing.Point(48, 32);
this.lblNumber.Name = "lblNumber";
this.lblNumber.TabIndex = 0;
this.lblNumber.Text = "请输入奇数:";
//
// txbNumber
//
this.txbNumber.Location = new System.Drawing.Point(192, 32);
this.txbNumber.Name = "txbNumber";
this.txbNumber.TabIndex = 1;
this.txbNumber.Text = "";
//
// btnOK
//
this.btnOK.Location = new System.Drawing.Point(144, 80);
this.btnOK.Name = "btnOK";
this.btnOK.TabIndex = 2;
this.btnOK.Text = "OK";
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
//
// MagicSquare
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(432, 117);
this.Controls.Add(this.btnOK);
this.Controls.Add(this.txbNumber);
this.Controls.Add(this.lblNumber);
this.Name = "MagicSquare";
this.Text = "MagicSquare";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new MagicSquare());
}
private void btnOK_Click(object sender, System.EventArgs e)
{
number=Convert.ToInt32(txbNumber.Text.Trim());
if(number%2==1)
{
this.Hide();
ShowResult result=new ShowResult(number);
result.Show();
}
else
{
MessageBox.Show("您输入的不是奇数,请重新输入奇数!","输入错误");
}
}
}
}
/*这个类用来处理魔术矩阵的生成,以及在窗体上显示出来
Show.cs
*/
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace MagicSquare
{
/// <summary>
/// Show 的摘要说明。
/// </summary>
public class ShowResult : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private int n;
private int[,] mm;
public ShowResult ()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
public ShowResult (int number)
{
n=number;
mm=new int[n,n];
AssignValue(n);
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
Application.Exit();
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "ShowResult";
}
#endregion
public void AssignValue(int n)
{
int assignValue=1;
int p=n-1;
int col=p/2;
int row=0;
//初始化数组
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
mm[i,j]=0;
}
}
mm[row,col]=assignValue;
do
{
assignValue++;
col--;
row--;
if(col<0&&row<0)
{
row+=2;
col+=1;
}
else
{
if(col<0)
col=p;
if(row<0)
row=p;
}
if(mm[row,col]!=0)
{
col+=1;
row+=2;
}
mm[row,col]=assignValue;
}while(assignValue<n*n);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
Graphics g=this.CreateGraphics();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
g.DrawString(mm[i,j].ToString(),new Font(FontFamily.GenericSansSerif.ToString(),15f),Brushes.YellowGreen,j*40+20,i*40+20);
}
g.Dispose();
}
}
}
文章来源:
http://www.blogjava.net/kuxiaoku/articles/94805.html
posted on 2007-01-19 00:14
苦笑枯 阅读(993)
评论(0) 编辑 收藏 所属分类:
C#