2012年11月20日 星期二

戰艦謎題

內容 :
在一個2x2的格子圖形中,有三艘各佔一個格子的戰艦,戰艦的位置均在格子的範圍內。三艘戰艦重量皆不同,從1噸到3噸各有一艘,因為大霧瀰漫不知正確位置,僅知道每一列與每一行的總重量,請問聰明的你,知道每一艘戰艦的正確位置嗎?
舉例來說,如果我們知道每一列與每一行的總重量如下圖:
囗囗5
囗囗1
42

那麼這個戰艦謎題的一組正確答案如下圖:
325
101
42

注意:我們給的輸入資料不一定只有一組正確答案,這時候你只需輸出其中一組正確答案即可。此外,我們給的輸入資料有可能沒有正確的答案,這時候只需輸出"No solutions."即可。

輸入說明 :
總共有四個整數,每個數值間以一個空白字元隔開,這些數字個值均介於0到5之間。前2個整數依序表示每一列(row)的總重量,接下來的2個整數依序表示每一行(column)的總重量。
輸出說明 :
請輸出4個整數,分成兩列,每列含有2個整數,整數中間以一個空白隔開,表示2x2的格子中,停在每個位置的戰艦重量。其中以0表示沒有戰艦。(範例一就是上圖的例子)如果沒有解答請輸出 "No solutions."
範例輸入 :

輸入範例一: 
5 1 4 2 
輸入範例二: 
3 3 1 5 
輸入範例三: 
3 2 3 4
範例輸出 :

輸出範例一: 
3 2 1 0 
輸出範例二: 
0 3 1 2 
輸出範例三: 
No solutions.

2 則留言:

  1. Dim a, b, c, d, x1, x2, x3, x4 As Integer
    Dim havedo As Boolean
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do
    Input #1, x1, x2, x4, x3
    For a = 0 To 3
    If x1 + x2 <> x3 + x4 Then Print #2, "No solutions.": Exit For
    For b = 0 To 3
    For c = 0 To 3
    If a = b Then Exit For
    For d = 0 To 3
    If b = c Or a = c Then Exit For
    If a + b = x1 And c + d = x2 And a + c = x4 And b + d = x3 And havedo = False Then havedo = True: Print #2, a & " " & b & " " & c & " " & d
    Next
    Next
    Next
    Next
    havedo = False
    Loop Until EOF(1)
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  2. Dim s, t As Integer
    Dim tof As Boolean
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, X1, X2, Y1, Y2
    If X1 + X2 <> Y1 + Y2 Then Print #2, "No solutions."
    For i = 0 To 3
    tof = True
    For j = 0 To 3
    If i <> j Then
    If i + j = X1 Then s = Y1 - i: t = Y2 - j
    If s + t = X2 Then
    If s >= 0 And t >= 0 Then Print #2, i & " " & j & " " & s & " " & t: tof = False: Exit For
    End If
    End If
    Next j
    If tof = False Then Exit For
    Next i
    Loop
    Close #2
    Close #1
    End
    End Sub

    回覆刪除