原题:
某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:
(1) 密码单词的最小长度是两个字母,可以相同,也可以不同
(2) K不可能是单词的第一个字母
(3) 如果L出现,则出现次数不止一次
(4) M不能使最后一个也不能是倒数第二个字母
(5) K出现,则N就一定出现
(6) O如果是最后一个字母,则L一定出现
问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?
A) K B)L C) M D) N
问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少?
A)1个 B)3个 C)6个 D)9个
问题三:下列哪一个是单词密码?
A) KLLN B) LOML C) MLLO D)NMKO
问题四:3个相同的字母可以构成的不同密码单词的总数是多少?
A) 1个 B)2个 C) 3个 D) 4个
问题五:单词密码MMLLOKN可以通过下列变成另一个密码单词,除了:
A) 用N代替每个L B)用O代替每一个M C)用O代替 D)把O移到N的左边
从题干与问题我们不难得出一个结论: 求解某个字符串(遵循规则下的字符串)是否属于密码单词. 对于每个问题,我们都可以得出需要判断的字符串.
思路: 首先我们先写一个遵循以上规则的字符串的判断函数. 然后再根据每个问题判断出对应的字符串,最后得出每个问题的结论.
2 {
3 char[] ar = str.ToCharArray();
4 //密码单词的最小长度是两个字母,可以相同,也可以不同
5 if (ar.Length < 2)
6 {
7 return false;
8 }
9 //K不可能是单词的第一个字母
10 if (ar[0] == 'K')
11 {
12 return false;
13 }
14 //如果L出现,则出现次数不止一次
15 if (str.Contains("L"))
16 {
17 int Count = 0;
18 for (int i = 0; i < ar.Length; i++)
19 {
20 if (ar[i] == 'L')
21 {
22 Count++;
23 }
24 }
25 if (Count < 2)
26 {
27 return false;
28 }
29 }
30 //M不能使最后一个也不能是倒数第二个字母
31 if (ar[ar.Length - 1] == 'M' || ar[ar.Length - 2] == 'M')
32 {
33 return false;
34 }
35 //K出现,则N就一定出现
36 if (str.Contains("K"))
37 {
38 if (!str.Contains("L"))
39 {
40 return false;
41 }
42 }
43 //O如果是最后一个字母,则L一定出现
44 if (ar[ar.Length - 1] == 'O')
45 {
46 if (!str.Contains("L"))
47 {
48 return false;
49 }
50 }
51 return true;
52 }
针对问题一,我们可以得出需要判断的字符串 LOK,LOL,LOM,LON
2 {
3 string[] Str = { "LOK", "LOL", "LOM", "LON" };
4
5 for( int i = 0 ; i< Str.Length ; i++)
6 {
7 if (CheckStr(Str[i]))
8 {
9 Console.WriteLine(Str[i] + " OK");
10 }
11 else
12 {
13 Console.WriteLine(Str[i] + " Error");
14 }
15 }
16 }
第二个问题需要判断的字符串: KK,LL,MM,KL,LK,KM,MK,LM,ML
第三个问题需要判断的字符串: KLLN,LOML,MLLO,NMKO
第四个问题需要判断的字符串: KKK,LLL,MMM,OOO,NNN
第五个问题需要判断的字符串: MMNNOKN,OOLLOKN,OOOOOOO,MMLLNOK
以下问题都类似于第一个问题处理.