2010年3月23日 星期二

田鼠與狗

在田野中有一隻田鼠和一隻狗。狗想要吃掉田鼠,而田鼠則要儘速的逃進鼠洞中(田表面有許多鼠洞)。狗和田鼠都不是數學專家,但是也都不笨。當田鼠決定了某一個鼠洞後,就以一定的速度直線的跑去。而狗則非常擅長解讀肢體語言,當他一知道田鼠要往那個洞跑,就以田鼠2 倍的速度直線奔去,想要抓住田鼠。假如狗先到達那個洞,田鼠就會被吃掉,否則,田鼠就可安全逃走。
你必須幫田鼠選一個洞,使他可以逃離狗的魔掌(如果這樣的洞存在的話)。

輸入規範

輸入檔案中包含好幾組測試資料,每組測試資料的第一列有一個整數n 和4 個浮點數x1,y1,x2,y2。n(n £ 1000)代表本組測試資料有多少個鼠洞,4 個浮點數(均介於-10000 及+10000之間)代表田鼠(x1,y1)及狗(x2,y2)的x-y 座標。接下來的n 列,每列有2 個浮點數,代表每個鼠洞的座標。(所有的浮點數都到小數點後3 位測試資料組間有一空白列(請參考輸入範例)

輸出規範

每組測試資料輸出一列。如果田鼠可以逃走,請輸出"田鼠可由(x,y)的鼠洞逃走"。(x,y)是某一個洞的座標。如果田鼠無法逃走,請輸出"田鼠無法逃走"請注意:如果田鼠可以從不只一個洞逃走,請輸出在輸入中最前的洞。

輸入範例(test7.txt)
1 1.000 1.000 2.000 2.000
1.500 1.500
3 2.000 2.000 1.000 1.000
1.500 1.500
2.500 2.500
3.500 3.500
輸出範例(result7.txt)
田鼠無法逃走
田鼠可由(2.500,2.500)的鼠洞逃走

3 則留言:

  1. Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double, ansX As Double, ansY As Double
    Dim ans As Boolean
    Private Sub Form_Load()
    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, n, x1, y1, x2, y2
    ans = False
    For i = 1 To n
    Input #1, x3, Y3
    a = ((x1 - x3) ^ 2 + (y1 - Y3) ^ 2) ^ 0.5
    b = ((x2 - x3) ^ 2 + (y2 - Y3) ^ 2) ^ 0.5
    If b < 2 * a Then ans = True: ansX = x3: ansY = Y3
    Next i
    If ans = False Then
    Print #2, "田鼠無法順利逃走"
    Else
    Print #2, "田鼠可由(" & Format(ansX, "###0.000") & "," & Format(ansY, "###0.000") & ")的鼠洞逃走"
    End If
    Loop
    Close #2
    Close #1
    End Sub

    回覆刪除
  2. 高仔好,
    這程式初看正確。
    但是,題目中有說到如果有兩個洞可以出去,要印出的是?

    回覆刪除
  3. Dim mou(2) As Single
    Dim dog(2) As Single
    Dim ans As Boolean
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do Until EOF(1)
    ans = False
    Input #1, x
    Input #1, mou(1), mou(2), dog(1), dog(2)
    For i = 1 To x
    Input #1, q, w
    mxstep = Abs(mou(1) - q)
    mystep = Abs(mou(2) - w)
    dxstep = Abs(dog(1) - q)
    dystep = Abs(dog(2) - w)
    mdis = (mxstep ^ 2 + mystep ^ 2) ^ 0.5
    ddis = (dxstep ^ 2 + dystep ^ 2) ^ 0.5
    If (ddis / 2) > mdis Then
    Print #2, "田鼠可由("; q, w; ")的鼠洞逃走"
    ans = True
    End If

    Next i
    If ans = False Then Print #2, "田鼠無法逃走"
    Loop
    Close #1
    Close #2
    End Sub

    回覆刪除