# 北軟96 problemC ###### tags: `北軟96` ## 題目 一種密碼只由大寫字母 K、L、M、N、O 組成,密碼的字母由左至右寫成,符合下 列的條件才能組成密碼字串: 1、密碼文字最短為 3 個字母,可以重複: 2、K 不能為首字: 3、如果在某一密碼文字中有 L,則 L 就會出現 2 次以上: 4、M 不可為最後一個字母,也不可為倒數第二個字母: 5、如果密碼文字字串中有 K,那麼一定會 N 字母出現: 6、除非這個密碼文字字串中有 L 出現,否則 O 不可是最後一個字母: A) 設計一程式依上列條件,分次由 Text1 輸入 KLLN 或 LOML 或 MLLO 或 NMKO,按 A 題執行 鈕,依上述 1-6 條件請寫出判斷程式,則由 Text2 顯示出,如" KLLN 是正確密碼文字" 或" KLLN 不是正確密碼文字"字串出現。(6 分) B) 依由 Text3 輸入 NMKO 密碼,,按 B 題執行鈕,依上述 1-6 條件請寫出判斷程式,由 Text4 顯示出如" 本輸入密碼無法滿足第?條件" (?為 1-6 中的一個數字)。(6 分) C) 依由 Text5 輸入 XLKO 密碼字串及 Text7 輸入 OMXK,按 C 題執行鈕,依上述 1-6 條件 請寫出程式判斷式,按 C 題執行鈕,由 Text6 顯示出 Text5 應輸入正確的密碼字串, 由 Text8 顯示出 Text7 應輸入正確的密碼字串。(6 分) D) 某密碼只有字母 L、M、N、O 可用,每次由三個相同字母組成的密碼文字字串,依上述 1-6 條件請寫出程式判斷式,按 D 題執行鈕,計算共有多少種密碼可用(答案顯示在 Text9);可用的正確密碼為何? (答案顯示在 Text10,如有多組密碼可用,各組顯示以、 號區隔,如 CCC、AAA 型式顯示) (7 分)  ## 想法 不太確定第D要幹嘛,所以假設只有LLL,MMM,NNN,OOO的組合,不然我也想不太到他到底要幹嘛。 解法挺直觀的,我們可以寫一個verification來做處理,讓他回傳哪一個規則違反了,若全部正確,則回傳-1,這樣A、B就解決了。 接下來再寫一個fix,用來修復字串。 修復字串的方式,由於題目只要求你輸出正確的密碼,然後也沒要求你一定要改特定幾個字之類的,我們可以直接greedy,將不是字尾的字母全部改成O,將最後的字尾改成N,將所有要求的規則完美的規避掉,C解決。 接下來D更簡單了,由於寫了verification了,直接丟到verification確認密碼有沒有問題,解決! ## 程式碼(C#) ```csharp= using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace problemC { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private int verification(string str) { bool[] vec = new bool[6]; vec[0] = str.Length >= 3; vec[1] = !str[0].Equals('K'); vec[2] = true; vec[4] = true; vec[5] = true; int cnt = 0; for(int i = 0; i < str.Length; i++) { if (str[i] == 'L') vec[2] = false; if (str[i] == 'K') vec[4] = false; } for(int i = 0; i < str.Length && vec[2] == false; i++) { if (str[i] == 'L') cnt++; } for (int i = 0; i < str.Length && vec[4] == false; i++) { if (str[i] == 'K') vec[4] = true; } vec[2] = vec[2] == true ? true : cnt >= 2; vec[3] = str[str.Length - 1] != 'M' && str[str.Length - 2] != 'M'; if(cnt == 0) { vec[5] = !(str[str.Length - 1] == 'O'); } for(int i = 0; i < 6; i++) { if (vec[i] == false) return i + 1; } return -1; } private string fix(string str) { char[] array = str.ToCharArray(); for (int i = 0; i < str.Length; i++) { if (i != str.Length - 1) { array[i] = 'O'; } else { array[i] = 'N'; } } string result = ""; for(int i = 0; i < array.Length; i++) { result += array[i]; } return result; } private void button1_Click(object sender, EventArgs e) { string str = textBox1.Text; if(verification(str) == -1) { textBox2.Text = str + "是正確密碼文字"; } else { textBox2.Text = str + "不是正確密碼文字"; } } private void button2_Click(object sender, EventArgs e) { string str = textBox3.Text; textBox4.Text = "本輸入密碼無法滿足第" + verification(str) + "條件"; } private void button3_Click(object sender, EventArgs e) { string str1 = textBox5.Text; string str2 = textBox7.Text; textBox6.Text = fix(str1); textBox8.Text = fix(str2); } private void button4_Click(object sender, EventArgs e) { string[] str = new string[4] { "LLL", "MMM", "NNN", "OOO" }; int a = 0; for(int i = 0; i < str.Length; i++) { if (verification(str[i]) == -1) a++; } textBox9.Text = "4"; textBox10.Text = a.ToString(); } } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up