2011年10月12日 星期三

明明愛明明

內容 :
一看題名,你就該知道,這次跟迴文脫不了關係!
若你不確定什麼是「迴文」,請看 Google 字典的解釋:

迴文 huíwén

一種修辭方式。
通過詞語反復迴環使用,表達二者互相依存或彼此制約的關係,
如“人人為我,我為人人”、“饒人不癡漢,癡漢不饒人”。

輸入說明 :
一筆測試資料一行,包含許許多多但總數不超過 1000 個的大小寫英文字母和標點符號。
不可思議的是,裡面不會有任何空白字元。

輸出說明 :
如果重新安排順序後,有辦法讓這一堆英文字母變成迴文的話,輸出「yes !」,否則輸出「no...」。
注意,大寫和小寫字母視為相同,即 A 和 a 是一樣的,並且,請忽視所有非英文字母的字元。

範例輸入:

ababa
bbaaa
Level
aaabbbcc
abcdefg
HowAreYouToday
A_man,_a_plan,_a_canal:_Panama.

範例輸出 :

yes !
yes !
yes !
no...
no...
no...
yes !


來源:高中生程式解題

3 則留言:

  1. 想到一個方法
    既然它是可以排列組合
    那出現兩個單獨 就是錯的
    有成雙成對 或只有一個單獨就是對的

    Dim X(26)
    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)
    Line Input #1, N
    N = LCase(N)

    For i = 1 To 26: X(i) = 0: Next i

    For i = 1 To Len(N)
    M = Mid(N, i, 1)
    If "a" <= M And M <= "z" Then X(Asc(M) - 96) = X(Asc(M) - 96) + 1
    Next i

    If check = True Then Print #2, "no..." Else Print #2, "yes !"

    Loop

    Close #2
    Close #1
    End
    End Sub

    Function check() As Boolean '判斷是否有兩個單獨出現
    P = False
    A = 0
    For i = 1 To 26
    If X(i) Mod 2 <> 0 Then A = A + 1
    If A > 1 Then P = True
    Next i
    check = P
    End Function

    回覆刪除
  2. Dim ch As Boolean, F(26)
    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)
    Line Input #1, n
    ch = False
    For i = 1 To 26: F(i) = 0: Next

    Call A1(n)
    Call A2(n)
    Loop
    Close
    Close
    End
    End Sub



    Sub A1(a)
    Dim NewA
    For i = 1 To Len(a)
    m = Mid(a, i, 1)
    If m <= "z" And m >= "A" And m <> "_" Then m = UCase(m): NewA = NewA & m
    Next
    a = NewA
    End Sub

    Sub A2(a)

    sp = Int(Len(a) / 2)
    l = Left(a, sp)
    R = Right(a, sp)

    For i = 1 To Len(R)
    m = Mid(R, i, 1)
    nr = m & nr
    Next
    R = nr
    If R = l Then
    Print #2, "Yes !"
    Else


    For i = 1 To Len(a)
    m = Mid(a, i, 1)
    F(Asc(m) - 64) = F(Asc(m) - 64) + 1
    Next



    KK = 0
    For i = 1 To 26
    If F(i) Mod 2 <> 0 Then KK = KK + 1
    Next

    If KK = 1 Then Print #2, "Yes !" Else Print #2, "no..."
    End If


    End Sub

    回覆刪除
  3. 佑好,
    程式ok,邏輯想法很好。

    arro好,
    程式可能有小錯誤,你在判斷非英文字母的地方,是不是有些偷懶,該用a-z,A-Z的,不可以直接A-z,中間的幾個例外,會有錯誤的機會。
    還有,kk=0是不是應該也是yes!呢?

    回覆刪除