English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

這一題也是之前和網友討論的題目
現在就拿來藉花獻佛吧

方法不拘 (但是能不用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

6 個解答

是指只要印成那樣的方塊就行了嗎?
題目看不懂 "

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

fedest.com, questions and answers