生成魔方阵(周记05-03)

最近加紧学C#,同时又想再看看算法。谁要咱们在科研口,就是一个自己的时间多,当然money也就少些了。

书买了不少,什么《21天学通C#》、《C#Primer》还有《Microsoft .Net框架程序设计(修订版)》。当然这些书的选择是本人看了不少书评后才买的,看了看都是不错的选择,好书!

书虽好但也要人用心来看啊,本人利用业余时间基本已浏览一遍,更细的知识点就要在以后的学习中好好掌握了。

说到这里,说出来你死都不会相信我在单位还是个小头,平日里受尽老老少少、上上下下的“气”,只有下班后在书中找到一刻安宁。读书的目的至于此可见已是一种悲哀了。

我下定决心,不论单位的事和家里的事有多忙,每周写一篇学习周记,而非日记,日记是肯定没有时间来写的了。

先易后难,看了一下很久前买的一本《程序员高级程序员级 程序设计(第二版)》这本书上有不少好的算法例子,它们原来都是用C写的,我用C#重写一遍,在做一个小工具展示一下,这样比较直观。

第一个我们来看看P96上的生成魔方阵问题。

魔方阵是指元素为自然数1,2,…,N2 的N×N方阵,每个元素值均不相等,每行、列及主、副对角线上各N个元素之和都相等。

对奇阶魔方阵,可用Dole Rob算法生成,其过程为:从1开始,以此插入各自然数,直到N2为止。选择插入位置原则为:

a. 第一个位置在第一行的正中;

b. 新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如超出右边界则新边界取应选行的最左一个位置;

c. 若最近一个插入元素为N的整数倍,则选下面一行同列的位置为新位置。

本算法的实现就需要用到二维整数数组实现方阵。

核心算法如下:

private void button1_Click(object sender, System.EventArgs e)

{ //这部分为生成魔方阵的Dole Rob算法。

int count,curi,curj;

int i,j;

int[,] magic=new int[3,3];

string a;

curi=0;

curj=1;

for(count=1;count<=9;count++)

{

magic[curi,curj]=count;

if((count%3)==0)//最近一个插入元素为阶数的整数倍,则选下面一行同列上的位置为新位置。

{

curi+=1;

continue;

}

curi=curi-1;

curj=curj+1;

if(curi<0)

curi+=3;

else if(curj==3)

curj-=3;

}

textBox1.AppendText("\n");//下面在textBox1中显示生成的魔方阵

for (i=0;i<3;i++)

{ textBox1.AppendText("\n");

for(j=0;j<3;j++)

{ a = Convert.ToString(magic[i,j]);

textBox1.AppendText(a);

textBox1.AppendText(" ");

}

textBox1.AppendText("\n");

}

label1.Text="本例中的魔方阵的阶数这里取3,当然也可以增加控制阶数的控件,为了简单这里不再给出。";

}

图1 点击“生成魔方块”按钮前

图2 点击“生成魔方块”按钮后

在重写改算法时,有几个问题给我印象很深:

a. magic[curi,curj]是这样写,而不是写成magic[curi],[curj],后者是c的写法。

b. a = Convert.ToString(magic[i,j])这一句很关键,否则结果无法在textBox1中显示,convert类是在system命名空间中的,它的一些方法转换数据类型起来很有用。为什么要转换,因为textBox1.AppendText(a)中a一定要为string类型。

c. C#语言里是严格区分大小写的。

好了,就写到这里吧,你别说做你喜欢的事情即使累心里也甜甜的。

明天又要………,当老百姓最快活但老百姓的奖金毕竟少些,矛盾啊,嘿嘿,J。

时间: 2024-10-28 21:21:42

生成魔方阵(周记05-03)的相关文章

c-请教一下魔方阵的问题。。

问题描述 请教一下魔方阵的问题.. (每一行每一列以及对角线之和都相等的方阵) 要求输出1--n*n的魔方阵 (..用的方法不好..但是不知道哪里错了>_<) #include #include int main() { int m[15][15],k,n,i,j; for(n=2;n%2==0;) {printf("enter your number:"); scanf("%d",&n);} for(k=1,i=1,j=(n+1)/2;k<

C语言实现奇数阶魔方阵的方法_C 语言

本文实例讲述了C语言实现奇数阶魔方阵的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: #include "stdio.h" #include "string.h" #include "stdlib.h" #define N 5 void main(){ int a[N][N]={0}; int i,j; int k; i = 0; j = N/2; a[0][j]=1; for(k = 2; k <= N*N; k++

linux下c语言魔方阵程序

#include<stdio.h> #include<stdlib.h> int main() { int a[31][31], i, j, m, n, p = 0; while(p == 0) { system("clear"); printf("请输入不大于30的奇数:"); scanf("%d",&m); if(m != 0 && m <= 30 && m % 2 !=

java.text.format 将字符串“060503”转化为06:05:03或者将&amp;quot;20081002102030“转化为2008-10-02 10:00:30

直接贴代码,不解释: package com.chapter.five.one.tcn; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TestDate2 { public static void main(String[] args) throws ParseException

如何求n阶方阵中各条反斜线上的元素之和4*4

#include<stdio.h> void main() { //其中第一条斜线是00 - 11 - 22 -33 第二条10 - 21 - 32 int arr2[4][4] = { 00, 01, 02, 03, 10 , 11, 12, 13, 20 , 21, 22, 23, 30, 31, 32, 33,}; int i, j; int sum = 0; int index = 0; for (int i = 0; i < 4; i++) { for (int j = 0;

简介EXCEL与ORACLE间的数据互传方法

众所周知,Microsoft Excel能很直观而方便地进行数据输入,统计,生成图表,但它的数据管理能力有限,对大量的数据查询能力不足,如果利用它数据计算方面的优点和大型数据库ORACLE的数据查询优点,可以设计出功能强大的数据处理系统. 假设与Excel数据文件相对应的职工情况表EMP已在ORAC LE系统中创建,此表中各字段按照顺序分别是职工代号( Emp-No),职工姓名(Ename),工资(Salary),雇用时间(Hiredate). 本文将通过此例来介绍Excel与ORACL E数据

实操 Web Cache

实操 Web Cache http://netkiller.github.io/journal/cache.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地518131+86 13113668890+86 755 29812080<netkiller@msn.com> $Id$ 版权 2011, 2012, 2013, 2014 http://netkiller.github.io $Date$ 摘要 写这篇文章的原

[工具学习]IOzone参数

IO_ZONE参数详解. 2009-08-24 22:28 IOzone是一个文件系统基准工具,它生成许多文件操作并执行测试.Iozone能够运行于许多平台.这份文档涵盖Iozone所执行的许多不同类型的操作和它的所有命令行参数. Iozone执行以下操作测试文件I/O性能: Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read/write, pread/pwrite va

C++ 算法大全

第3章 控制语句  /* 1.打印出所有的"水仙花数".所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如,153是一水仙花数,因为153 = 13 + 53 + 33. */ #include<iostream.h> void main() { int i, a=0, b=0, c=0; for(i=100;i<1000;i++) { a=i%10; b=i/10%10; c=i/100%10; if(a*a*a+b*b*b+c*