這一題也是之前和網友討論的題目
現在就拿來藉花獻佛吧
方法不拘 (但是能不用2維陣列就不要用 Orz)
N=2
23
14
N=3
349
258
167
N=4
4 5 12 13
3 6 11 14
2 7 10 15
1 8 9 16
字的跑法會像玩貪食蛇一樣彎彎彎
2005-11-25 08:59:48 · 6 個解答 · 發問者 ? 5 in 電腦與網際網路 ➔ 程式設計
重申一下好了(舊友新知都要照顧到)
我發程式問題的原則
演算法或是程式碼都歡迎 ^^
你的演算法看不懂我會問
問了還是不懂 就是我程度還不夠
所以盡量回吧 ^^
2005-11-25 09:03:46 · update #1
感謝W.J.S.大及Phoenix大的回應
W.J.S.大寫的程式是正確的 ^^
Phoenix大的程式還在研究中~~
遞迴啊 @@
之前完全都沒想到說有這樣的規律說 研究研究!! ^^
2005-11-26 03:13:24 · update #2
感謝各位大大的踴躍回答....
總覺得看到了很多不可思議的解法 @@
研究研究 ^^;
2005-11-28 03:37:49 · update #3
是指只要印成那樣的方塊就行了嗎?
題目看不懂 "
2005-11-25 22:49:30 補充:
一樣的手段解出來了\( ̄▽ ̄)/
遞迴真是好物呀 ̄▽ ̄
連同上一題的程式碼一起貼上了@@
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int n = 0;
Console.Write("輸入範圍:");
n = int.Parse(Console.ReadLine());
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
Console.Write("\t" + ret(j, i, n));
}
Console.WriteLine();
}
Console.Write("輸入範圍:");
n = int.Parse(Console.ReadLine());
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
Console.Write("\t" + snak(j, i, n));
}
Console.WriteLine();
}
}
static int snak(int X, int Y, int N)
{
if ((X == 1) && (Y == 1))
return N;
if (X == 1)
return N - Y + 1;
if (X == 2)
return N + Y;
return N * 2 + snak(X - 2, Y, N);
}
static int ret(int X, int Y, int N)
{
if (Y == 1)
return X;
if ((X == 1) && (Y == 1))
return 1;
if ((X == 1) && (Y == 2))
return (N - 1) * 4;
if (X == N)
return Y + X - 1;
if (X == 1)
return ret(1, 2, N) - Y + 2;
if (Y == N)
return ret(1, Y, N) - X + 1;
return ret(1, 2, N) + ret(X - 1, Y - 1, N - 2);
}
}
}
---------------------------------------------------------------------------------------
在此解釋一下這兩個演算法@@,有錯誤的話也要提出來唷。
我是先解螺旋型的那一題,當看到月島大說不能用二維陣列時,我原本的解法就粉碎了 ̄▽ ̄b
所以我想做到的是一行一行印出來,
以螺旋型那一題而言,可以看出數字方陣有一些規律:
return ret(1, 2, N) + ret(X - 1, Y - 1, N - 2);
1. [1, 1]一定為1
2. 橫的第一行的值為X
3. 直的最後一行的值為Y + N - 1
4. 橫的最後一行的值和第一行的規律相反為遞減
5. 直的第一行第二個數以後也為遞減
不過到這裡還是沒辦法找到直二以後的印出公式,
經過觀察N從1到5的結果後發現
6. [1, 2]是有規律的,其公式為(N - 1) * 4
到這裡最外圍就全部可以印出來了 ̄▽ ̄
那怎麼印出方塊內部呢?
這裡就是為什麼使用遞迴的關鍵了
7. [2, 2] - [1, 2] = [1, 1]
所以,最後我使用了遞迴完成這一題0.0
-----------------------------------------------------------------------------------------
貪食蛇這一題的規律比螺旋型簡單多了
知道了螺旋型怎麼解後,當然還是使用遞迴來完成= =+
從方陣可以知道的規律是:
1. [1, 1] = N
2. 直1是遞減的
3. 直2為遞增
4. 直3為直1 + 一個規律值
得解。
---------------------------------------------------------------------------------------
抱歉唷^^"
讓你們看這麼長的文
雖然不是什麼了不起的技巧
程式碼也不短
不過想說PO出我在思考的過程給剛入門的新手參考參考
或許可以提供一點幫助
謝謝大家耐心看完我的廢話唷^^b
2005-11-25 17:49:30 · answer #1 · answered by Anonymous · 0⤊ 0⤋
Option Explicit
Private Sub Command1_Click()
Dim n As Integer
Dim x As Integer
Dim y As Integer
Dim z As Integer
Dim ans() As Integer
n = 4
z = 0
ReDim ans(n ^ 2)
For x = 1 To n
If x Mod 2 = 0 Then
For y = x To n ^ 2 Step n
z = z + 1
ans(y) = z
Next
Else
For y = n ^ 2 - (n - x) To 1 Step -n
z = z + 1
ans(y) = z
Next
End If
Next
For x = 1 To n ^ 2
Print ans(x);
If x Mod n = 0 Then Print
Next
End Sub
2005-11-28 08:19:25 · answer #2 · answered by 世賢 7 · 0⤊ 0⤋
Dim b
For a = 0 To Text1 - 1
For a1 = 1 To Text1
If a1 Mod 2 = 1 Then
b = Text1 * a1 - a
Print b & vbTab;
End If
If a1 Mod 2 = 0 Then
b = b + (a * 2) + 1
Print b & vbTab;
End If
Next
Print
Next
2005-11-26 07:06:06 · answer #3 · answered by 暴走生物 1 · 0⤊ 0⤋
這兩題可以用 split 嗎?
還是只是不能 dim 二維陣列而已?
2005-11-25 18:10:04 補充:
呵呵,因為 split 出來就變成陣列,那就很好處理了
不過我現在用別的方法...^.^弄好了再貼上來
2005-11-26 10:55:54 補充:
呵呵~我的做法就像是先弄一串數字出來例如: 輸入n=4, nXn = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"然後咧...先變成這樣..2 3 4 5 6 7 8 9 10 11 12 13 14 15 161再變成這樣3 4 5 6 7 8 9 10 11 12 13 ...21然後記錄往下 n-1 再5 6 7 8 9 10 11 12 13...432 1 然後一直轉...n - 18 9 10 11 12 13 14 ...76 15 4 3 2然後再轉 n - 211 12 13 14 15 1610 1 2 39 48 7 6 5然後再轉 n - 212 13 14 15 1611 2 3 410 1 5 9 8 7 6然後轉 n - 113 14 15 1612 3 4 511 2 1 610 9 8 7最後確認 CountNumbers(xNx) < 4 時則跳出迴圈...CountNumber (byval xString as string) as integer基本上是我用來計算一個字串內有多少個數字例如: xString = "1 2 3 4 5" , countNumber xString 就會回傳 5另外我還有用一個 get_number_from_string ( byval xString as string) as string作用是把數字由字串內取出...所以數字與數字間必須有個空白,或是其他符號來區隔。在這邊,我用空白鍵,以維持外觀。所取出的『數字』,我是定義為『字串』型態,是因為我又不打算拿來做加減乘除用,幹嘛要用數字型態?最後,你會覺得為什麼我的排列和你的範例不太一樣?呵呵~問題是出在我的拆解方式,是類似像蛇一樣慢慢往裡面繞如果要變成你那種,其實也很簡單,轉圈圈都寫出來了接下來只要控制好迴圈就可以變成這樣n = 31 2 3 4 5 6 7 8 92 3 4 5 6 7 8 913 4 5 6 7 8 921 4 5 6 7 8 9 31 2 5 6 7 8 91 42 31 6 7 8 92 53 41 2 7 8 9 3 6 4 52 3 8 91 4 7 5 63 4 92 5 81 6 7另外前一題,也用同樣方式修改一下ex: n = 3 , nXn = "1 2 3 4 5 6 7 8 9"1 2 3 4 5 6 7 8 92 3 4 5 6 7 8 913 4 5 6 7 8 921...省略...98765432 1....省略...98 17 26 3 5 4...省略...1 2 3 9 4 8 5 7 6...省略...2 3 41 9 5 8 6 73 4 52 9 61 8 7
2005-11-29 14:31:11 補充:
阿!!是印出呀?虧我還讓他一圈一圈跑哩...殘念...
2005-11-26 05:55:54 · answer #4 · answered by Anonymous · 0⤊ 0⤋
那用兩個一維陣列,行不行?
2005-11-25 19:56:02 補充:
Private Sub Command1_Click()
Dim N As Integer, I As Integer, J As Integer, X As Long, Y As Long, W As Integer, Z As Integer
Cls
Do
N = InputBox("輸入數值")
Loop Until IsNumeric(N)
Me.ScaleMode = 3
Y = 30 * (N - 1): W = 1
For I = 1 To N
For J = 1 To N
Me.CurrentX = X
Me.CurrentY = Y
Y = Y - 30 * W
Z = Z + 1
Print Z
Next
Y = Y + 30 * W
W = W * -1
X = X + 30
Next
End Sub
第二題(不知道有沒有違規)
Private Sub Command1_Click()
Dim N As Integer, I As Integer, X As Integer, Y As Integer
Dim W As Integer, Z As Integer, Str As String, B As Boolean
Cls
Do
N = InputBox("輸入數值")
Loop Until IsNumeric(N) And N > 0
Me.ScaleMode = 3
Y = 30 * (N - 1): W = -1: Z = 1: N = N ^ 2
Str = "'0," & Y & "'0,-30'" & Y + 30 & ",0'" & Y & "," & Y + 30 & "'"
For I = 1 To N
Me.CurrentX = X
Me.CurrentY = Y
Print I
If B Then
If InStr(Str, "'" & X + 30 * Z & "," & Y & "'") > 0 Then B = Not B: Z = Z * -1
Else
If InStr(Str, "'" & X & "," & Y + 30 * W & "'") > 0 Then B = Not B: W = W * -1
End If
If B Then
X = X + 30 * Z
Else
Y = Y + 30 * W
End If
Str = Str & X & "," & Y & "'"
Next
End Sub
2005-11-25 14:56:02 · answer #5 · answered by W.J.S. 7 · 0⤊ 0⤋
該怎麼說好呢
kukka大 您還是把題目看清楚吧 Orz
2005-11-25 16:25:49 補充:
現在的知識+好怪
我的本意是
只要會變成2維陣列的方法都禁止
其它都無所謂
方法不拘 (但是能不用2維陣列就不要用 Orz)
我記得我是這麼寫的吧
所以這一題沒差 ^^;
2005-11-28 08:55:31 補充:
沒錯 ^^; 就是印出題目的方塊
2005-11-25 10:44:19 · answer #6 · answered by ? 5 · 0⤊ 0⤋