close

題目:網路斷線
當太許多人同時使用Internet時, 網路變成非常慢。為了解決這個問題, 德國Ulm大學發展出在最高負載時間的應急規劃,以系統化公平的方式切斷國內一些城市的上網路徑。以 1 到N 隨機代表德國的城市。 Freiburg 是 1 , Ulm 是 2 , Karlsruhe 是 3 , 並且依此類推出一純粹隨機的次序。
然後, 隨意地選擇一數字M , 並且首先在城市 1 切斷上網路徑,接著依次切斷其後第M個城市, 超過N則回頭到1,並且不計入已經斷線的城市。例如, 如果 N=17 和 M=5 , 城市斷線的次序為 [1, 6, 11, 16, 5, 12, 2, 9, 17, 10, 4, 15, 14, 3, 8, 13, 7]。
寫一個程式讀入N後(3 &lE; N < 150),決定最小的整數M,使得 Ulm 能夠確保成為最後一個被斷線的城市。
[範例輸入]
3
[範例輸出]
2

[範例輸入]
7
[範例輸出]
3



1. 請依題目說明畫出解答此題之流程圖
2. 承上題,請將程式碼剪貼上

想法
        我的解法滿暴力的 .
        我先做一個 array 城市最大數是 150 , 也就是我這個 array的大小
        依照題目的說法 , 編號 2 要最後拜訪 , 所以 M 不可能是 1
  如果N = 15 , 超過 15 又要從頭來 , 所以可以知道這是一個循環的狀況
  於是 M 的上限是 N
  因為我們想知道最小的M是多少 , 所以我的想法很簡單
  我們就從 2 開始 try try到 N
  只要Try到某一個 M 可以滿足題設 , 那就把這個 M output出來

  所以這個程式要先準備一些東西

  一個是那個循環的機制
  我設一個變數叫 check 另他初始值為 1
  我們去一一檢查 array內的值
  如果 array 沒有被拜訪過
  也就是array內的值是 0
        那check才可以加1
        如果check = 目前的 M 的話
       我們就要看 array 的值是不是 0
       如果不是 0 代表之前有斷過電
       那就不管他 , 再到下一個
       如果是 0 就改成 1
       然後把 count + 1 ,
       count 是一個計算現在斷了幾家店的計數用的變數
       
       再中間可能會遇到一些狀況
       比如在 i + 1 的時候 超過了 N
     這時候就把 i 設成 2 來做到循環的樣子

      最後還要判斷目前設的這個M是不是我們要的
     那個條件就是
    當count = N 的時候 i 是 2
    就表示了 2 是最後一個被斷電的 也就是題目想要的情況
    
    那如果不是的話 , 就要把 M 設成另一個數
    把一切變數都弄回初始的樣子
  然後再進行那些動作 直到找到為止

以下是程式碼 及圖片


很簡陋的流程圖



Dim a(150) As Integer
        Dim i, n, check, count, j, ans As Integer
' i , j  計數用 , 其中 j 其實就是題目的 M , 只是習慣用j記數
' n是題目中的N
' check = j 時要檢查要不要斷電
' count = n時要看最後一個斷的是不是 2 , 用來當程式結束的判斷

       
' 你在左邊的 textbox的輸入就是input
n = TextBox1.Text

        For j = 2 To n
'深藍色這一段代表你每次試一個新的 j 時要作的初始化的動作
            ans = 0
            check = 1
            count = 1

            For i = 1 To n
                a(i) = 0
            Next
            a(1) = 1
            i = 1
            Do While count <> n

                If check = j Then
                    If a(i) = 0 Then
                        a(i) = 1
                        count = count + 1
                        check = 1
                    End If
                Else
                    If a(i) = 0 Then
                        check = check + 1
                    End If
                End If
'檢察結束條件
                If count = n And i = 2 Then
                    ans = j
                End If

                i = i + 1
'檢查循環
                If i > n Then
                    i = 2
                End If
            Loop
'檢察結束條件            
           If ans <> 0 Then
                Exit For
            End If
        Next
'把結果印在右邊的 textbox裡
        TextBox2.Text = ans



最後附上整個程式的檔案

arrow
arrow
    全站熱搜

    偽新聞新聞雜誌 發表在 痞客邦 留言(0) 人氣()