---
# System prepended metadata

title: 北軟96 problemC
tags: [北軟96]

---

# 北軟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 分)

![](https://i.imgur.com/uhwSMxg.png)

## 想法

不太確定第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();
        }
    }
}
```