求VB.NET下的魔方阵算法

sanji09 2008-09-04 10:54:19
求VB.NET下的魔方阵(九宫图)算法
能给出代码的有高分,
条件:
Textbox框 2个 button 按钮一个
Textbox1里面输入数字(最大99)同时Textbox2中也要显示同样的数字,按生成按钮输出魔方阵
可能需要判断奇,偶魔方阵还有4的倍数+2型的魔方阵吧
例如 Textbox1中输入5,Textbox2中也会出现5,最后生成一个5x5的魔方阵

...全文
401 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanji09 2008-09-09
  • 打赏
  • 举报
回复
to 12楼 我写的是n阶的

算奇数的话 请看我的第一个方法
Public Function lsKisuu(ByVal iCount As Integer)
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
giX = (grdTxt.Rows.Count + 1) / 2 - 1 '第一個の数字は第一行の中間にになります
giY = 0
For i As Integer = 1 To iCount * iCount
magic(giY, giX) = i
If i Mod iCount = 0 Then 'すぐ1個数がiCountの倍数な時、まっすぐな下に置きます
giY = giY + 1
ElseIf giY = 0 Then '上の境を超える時
giX = giX + 1
giY = iCount - 1
ElseIf giX = iCount - 1 Then '右側の境を超える時
giX = 0
giY = giY - 1
Else '正常な情況の下
giX = giX + 1
giY = giY - 1
End If
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
Return 0
End Function
rainbowsoftware 2008-09-09
  • 打赏
  • 举报
回复
mark
rilysl 2008-09-09
  • 打赏
  • 举报
回复
你的貌似麻烦点?我给你个奇数的算法。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If txtbox.Text = 0 Then
MsgBox("please input number into the txtbox")

Else
Dim n As Integer

n = txtbox.Text - 1
Dim x As Integer = n
Dim y As Integer = n
Dim a(x, y) As Integer
Dim check() As Integer
y = n
x = n / 2

Dim hh As Integer = 1
a(x, y) = 1
Do
If x < n And y < n Then
hh += 1
If a(x + 1, y + 1) = 0 Then
x += 1
y += 1
a(x, y) = hh
Else : y -= 1
a(x, y) = hh
End If
ElseIf x = n And y < n Then
hh += 1
If a(0, y + 1) = 0 Then
x = 0
y += 1
a(x, y) = hh
Else : y -= 1
a(x, y) = hh
End If
ElseIf x < n And y = n Then
hh += 1
If a(x + 1, 0) = 0 Then
x += 1
y = 0
a(x, y) = hh
Else
y -= 1
a(x, y) = hh
End If
ElseIf x = n And y = n Then
hh += 1
If a(0, 0) = 0 Then
x = 0
y = 0
a(x, y) = hh
Else : y -= 1
a(x, y) = hh
End If


End If
Loop Until hh = (n + 1) ^ 2
RichTextBox1.Text = ""
Dim aa As String = ""

For y = 0 To n
For x = 0 To n
aa = aa & " " & a(x, y)
Next
aa = aa & Chr(10) + Chr(13)
Next
RichTextBox1.Text = aa
End If

End Sub
sanji09 2008-09-09
  • 打赏
  • 举报
回复
好像没人写呀,还好自己写出来了

Public Class Form1
Dim giX As Integer = 0 '次数字の保存位置
Dim giY As Integer = 0 '次数字の保存位置
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''-------------------------------------------------
'' [処理名]:Form1_Load
'' [機 能]:初期化
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
grdTxt.Rows.Count = 0
grdTxt.Cols.Count = 0
grdTxt.AllowEditing = False
End Sub
''-------------------------------------------------
'' [処理名]:btnClose_Click
'' [機 能]:終了
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close()
End Sub
''-------------------------------------------------
'' [処理名]:txtTi1_TextChanged
'' [機 能]:txtTi2はtxtTi1の値を得ます
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub txtTi1_TextChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtTi1.TextChanged
txtTi1.Focus() '焦点を得ます
txtTi2.Text = txtTi1.Text
End Sub

Private Sub btnBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBegin.Click
Try
If CInt(txtTi1.Text) > 2 Then
grdTxt.Rows.Count = Int(txtTi1.Text)
grdTxt.Cols.Count = Int(txtTi1.Text)
If Int(txtTi1.Text) Mod 2 = 1 Then '奇方陣(3×3,5×5,7×7・・・)
lsKisuu(Int(txtTi1.Text))
ElseIf Int(txtTi1.Text) Mod 4 = 0 Then '偶方陣 4の倍数型(4×4,8×8,12×12・・・)
lsGuusuu(Int(txtTi1.Text))
ElseIf Int(txtTi1.Text) Mod 4 = 2 Then '偶方陣 4の倍数+2型(6×6,10×10,14×14・・・)
lsGuusuu4plus2(Int(txtTi1.Text))
End If
Else
MessageBox.Show("指定の値では、魔方陣を作成できません", "魔方陣")
End If

Catch ex As Exception
MessageBox.Show("数字のみ指定できます", "魔方陣")
End Try

End Sub
Public Function lsKisuu(ByVal iCount As Integer)
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
giX = (grdTxt.Rows.Count + 1) / 2 - 1 '第一個の数字は第一行の中間にになります
giY = 0
For i As Integer = 1 To iCount * iCount
magic(giY, giX) = i
If i Mod iCount = 0 Then 'すぐ1個数がiCountの倍数な時、まっすぐな下に置きます
giY = giY + 1
ElseIf giY = 0 Then '上の境を超える時
giX = giX + 1
giY = iCount - 1
ElseIf giX = iCount - 1 Then '右側の境を超える時
giX = 0
giY = giY - 1
Else '正常な情況の下
giX = giX + 1
giY = giY - 1
End If
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
Return 0
End Function
Public Function lsGuusuu(ByVal iCount As Integer) As Integer
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
Dim currnum As Integer '偶方陣を作って数の変数
If iCount Mod 4 = 0 Then
For i As Integer = 0 To iCount / 2 - 1 '記号をします
For j As Integer = 0 To iCount / 2 - 1
If (i + j) Mod 2 = 0 Then
magic(i, j) = -1
magic(i, iCount - j - 1) = -1
magic(iCount - i - 1, j) = -1
magic(iCount - i - 1, iCount - j - 1) = -1
End If
Next
Next
For i As Integer = 0 To iCount - 1 '数字を出力します
For j As Integer = 0 To iCount - 1
currnum = i * iCount + j
If magic(i, j) = -1 Then
magic(i, j) = iCount * iCount - currnum
Else
magic(i, j) = currnum + 1
End If
Next
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
End If
Return 0
End Function
Public Function lsGuusuu4plus2(ByVal iCount As Integer) As Integer


Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
Dim sizem As Integer = (iCount / 2 - 1) / 2
Dim sizeh As Integer = iCount / 2
Dim sizesq As Integer = (iCount / 2) * (iCount / 2)
Dim iSt_x As Integer = 0
Dim iSt_y As Integer = 0
Dim iSt_i As Integer
Dim temp As Integer
If iCount Mod 4 <> 0 Then
For iSt_i = 0 To 4 '魔方陣を4つに分けます
Select Case iSt_i
Case 0 '左上 A
iSt_x = 0
iSt_y = 0
Case 1 '右下 B
iSt_x = sizeh
iSt_y = sizeh
Case 2 '右上 C
iSt_x = sizeh
iSt_y = 0
Case 3 '左下 D
iSt_x = 0
iSt_y = sizeh
End Select
giX = (iCount / 2) / 2 '第一個の数字は第一行の中間にになります
giY = 0
For i As Integer = 1 To sizesq
magic(giY + iSt_y, giX + iSt_x) = i + sizesq * iSt_i
If i Mod (iCount / 2) = 0 Then 'すぐ1個数がiCountの倍数な時、まっすぐな下に置きます
giY = giY + 1
ElseIf giY = 0 Then '上の境を超える時
giX = giX + 1
giY = iCount / 2 - 1
ElseIf giX = iCount / 2 - 1 Then '右側の境を超える時
giX = 0
giY = giY - 1
Else '正常な情況の下
giX = giX + 1
giY = giY - 1
End If
Next 'end of for (count)
Next 'end of for (iSt_i)

'数字を出力します
For j As Integer = 1 To sizem
temp = magic((iCount / 2) / 2, j)
magic((iCount / 2) / 2, j) = magic((sizeh + 1) / 2 + sizeh - 1, j)
magic((sizeh + 1) / 2 + sizeh - 1, j) = temp
Next
For i As Integer = 0 To sizeh
If i = (sizeh + 1) / 2 - 1 Then
Exit For
End If
For j As Integer = 0 To sizem
temp = magic(i, j)
magic(i, j) = magic(sizeh + i, j)
magic(sizeh + i, j) = temp
Next
Next
For i As Integer = 0 To sizeh
For j As Integer = iCount - sizem + 1 To iCount - 1 Step -1
temp = magic(i, j)
magic(i, j) = magic(sizeh + i, j)
magic(sizeh + i, j) = temp
Next
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
End If

End Function
End Class
sanji09 2008-09-08
  • 打赏
  • 举报
回复
请大家帮忙看看
sanji09 2008-09-08
  • 打赏
  • 举报
回复
到不是我手懒,只是刚刚学习vb.net一个多星期,不知道怎么下手
先写了一个奇数的幻方,大家帮忙改改

Public Class Form1
Private giRecord_Magic(,) As Integer '配列

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
grdTxt.Rows.Count = 0
grdTxt.Cols.Count = 0
grdTxt.AllowEditing = False
End Sub
''-------------------------------------------------
'' [処理名]:btnClose_Click
'' [機 能]:終了
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close()
End Sub
''-------------------------------------------------
'' [処理名]:txtTi1_TextChanged
'' [機 能]:txtTi2はtxtTi1の値を得ます
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub txtTi1_TextChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtTi1.TextChanged
txtTi1.Focus()
txtTi2.Text = txtTi1.Text
End Sub

Private Sub btnBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBegin.Click
Try

If CInt(txtTi1.Text) > 2 Then
grdTxt.Rows.Count = Int(txtTi1.Text)
grdTxt.Cols.Count = Int(txtTi1.Text)
If Int(txtTi1.Text) Mod 2 = 1 Then
lsKisuu(Int(txtTi1.Text))
Else
MessageBox.Show("ff")
End If
Else
MessageBox.Show("指定の値では、魔方陣を作成できません", "魔方陣")
End If

Catch ex As Exception
MessageBox.Show("数字のみ指定できます", "魔方陣")
End Try

End Sub
Public Function lsKisuu(ByVal iCount As Integer)

Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer
Dim i As Integer = -1
Dim j As Integer = (grdTxt.Rows.Count + 1) / 2 - 1
Dim count = grdTxt.Rows.Count
Dim a As String
For count = 1 To iCount * iCount
If grdTxt.Rows.Count Mod 2 = 1 Then
i += i
Else
i -= i
j += j
End If
If i < 0 Then
i = grdTxt.Rows.Count - 1
End If
If j >= grdTxt.Rows.Count Then
j = 0
End If
magic = count
Next
For i = 0 To iCount
For j = 0 To iCount
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
a = Convert.ToString(magic(i, j))
Next
Next
Return 0
End Function

End Class
gh_li 2008-09-05
  • 打赏
  • 举报
回复
楼主,做人不那么懒的!
sanji09 2008-09-05
  • 打赏
  • 举报
回复
没人给出算法代码吗?
wanghui0380 2008-09-04
  • 打赏
  • 举报
回复
??幻方的算法是一个固定的算法,和语言没啥关系。任何语言写的幻方算法都可以转到net下用的

请google:n维幻方算法
sanji09 2008-09-04
  • 打赏
  • 举报
回复
textbox1中输入任意数字(范围3-99) textbox2.text=textbox1.text
按生成按钮就输出下相应的魔方阵
sanji09 2008-09-04
  • 打赏
  • 举报
回复
奇数型
5x5的 横竖斜分别相加都相等

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

偶数型
4x4
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

4的倍数+2型
10x10
1 92 8 94 95 6 97 3 99 19
20 12 83 17 86 85 14 88 19 81
71 29 23 74 75 26 77 28 72 30
49 62 38 34 65 66 37 63 39 61
50 59 48 47 56 55 54 43 52 41
51 49 53 57 46 45 44 58 42 60
70 32 68 64 36 35 67 33 69 31
21 79 73 27 25 76 24 78 22 80
90 82 18 84 16 15 87 13 89 11
91 9 93 7 5 96 4 98 2 100
yanlongwuhui 2008-09-04
  • 打赏
  • 举报
回复
楼主没描述清楚。你说的魔方阵怎么表示,是在界面上显示5×5的格子还是有什么要求?
浮生若梦丶 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yanlongwuhui 的回复:]
还是楼上厉害。网上搜索到的算法:
最简单的幻方就是平面幻方,还有立体幻方、高次幻方等。对于立体幻方、高次幻方目前世界上很多数学家仍在研究,现在只讨论平面幻方。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)
⑴ N 为奇数时,最简单
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上
每一个数存放的行比前一个数的行…
[/Quote]
高手多啊
yanlongwuhui 2008-09-04
  • 打赏
  • 举报
回复
还是楼上厉害。网上搜索到的算法:
最简单的幻方就是平面幻方,还有立体幻方、高次幻方等。对于立体幻方、高次幻方目前世界上很多数学家仍在研究,现在只讨论平面幻方。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)
⑴ N 为奇数时,最简单
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
⑵ N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
⑶ N 为其它偶数时
当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。
按上述奇数阶幻方给分解的4个子方阵对应赋值
上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v)
即4个子方阵对应元素相差v,其中v=n*n/4
四个子矩阵由小到大排列方式为 ① ③
④ ②
然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2),
a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换
其中u=n/2,t=(n+2)/4 上述交换使每行每列与两对角线上元素之和相等。

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧