該題如果是用筆和紙去推倒排除,確實(shí)要花不少時(shí)間。
但是通過(guò)程序來(lái)寫(xiě) 就是最基本的循環(huán)加匹配程序了。

思路
如果用程序來(lái)寫(xiě)的話 ? 最簡(jiǎn)單直接的思路 就是 創(chuàng)建出所有的答案 (有4的10次方個(gè)),然后遍歷所有答案看是否滿足題目所給的條件,全部滿足的剩下的都是正確答案。 按這種思路來(lái)寫(xiě) 基本所有的語(yǔ)言都能寫(xiě) ,c ,c++ ,php++ ,swift,python,java ,通通都能寫(xiě)
正好前段時(shí)間稍微看了看python 所以 我就權(quán)當(dāng)python基本語(yǔ)法練習(xí)題來(lái)寫(xiě)了,題目不難,重點(diǎn)是思路??戳讼鹿娞?hào),大概是用了python的約束庫(kù) 所以就不用寫(xiě)創(chuàng)建所有答案的那部分。 ? 不過(guò)整體思路都一樣,畢竟這題目還是很直接的,下面看python代碼
1.創(chuàng)建所有答案 ?循環(huán)或者遞歸創(chuàng)建 ?
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
answers = ['a','b','c','d'] ?#四種答案
allanswers = [] ?#10道題的所有可能答案
#遞歸方式創(chuàng)建所有答案
def createAnswers(x = 0,tempAn = []):
? ? if x == 0:
? ? ? ? tempAn = []
? ? if x == 10:
? ? ? ? return
? ? for i in range(4):
? ? ? ? tempAn = tempAn[0:x]
? ? ? ? tempAn.append(answers[i])
? ? ? ? createAnswers(x+1,tempAn)
? ? ? ? if x == 9:
? ? ? ? ? ? allanswers.append(tempAn)
createAnswers()
#創(chuàng)建的所有答案可能性應(yīng)該是4的10次方
print(len(allanswers))
print(pow(4,10))
2.寫(xiě)出答案 需要滿足的所有條件
#題2
def func2(an):
? ? return ( an[4] == 'c' and? an[1] == 'a' ) or (an[4] == 'd' and an[1] == 'b') or \
? ? ? ? ? ? (an[4] == 'a' and an[1] == 'c') or (an[4] == 'b' and an[1] == 'd')
#題3
def func3(an):
? ? return? ( an[2] == 'a' and? an[5] == an[1] == an[3] !=? an[2] ) or ( an[2] == 'b' and an[2] == an[1] == an[3] !=? an[5] ) \
? ? ? ? ? ? or ( an[2] == 'c' and an[5] == an[2] == an[3] !=? an[1]? ) or (an[2] == 'd' and an[5] == an[1] == an[2] !=? an[3])
#題4
def func4(an):
? ? return (an[3]=='a' and an[0] == an[4]) or (an[3]=='b' and an[1] == an[6]) or \
? ? ? ? ? ? ( an[3]=='c' and an[0] == an[8]) or (an[3]=='d' and an[5] == an[9])
#題5
def func5(an):
? ? return (an[4] == an[7]? == 'a') or (an[4] == an[3]? == 'b') or \
? ? ? ? ? ? (an[4] == an[8]? == 'c') or (an[4] == an[6]? == 'd')
#題6
def func6(an):
? ? return (an[1] == an[3] == an[7] and an[5] == 'a') or (an[0] == an[5] == an[7] and an[5] == 'b') or \
? ? ? ? ? ? (an[2] == an[9] == an[7] and an[5] == 'c') or (an[4] == an[8] == an[7] and an[5] == 'd')
#獲取重復(fù)最少的答案
def getminZiMu(an):
? ? nums = [0,0,0,0]
? ? for a in an:
? ? ? ? index = ord(a) - ord('a')
? ? ? ? nums[index] += 1
? ? return answers[nums.index(min(nums))]
#題7
def func7(an):
? ? return (getminZiMu(an) == 'c' and an[6] == 'a') or? (getminZiMu(an) == 'b' and an[6] == 'b') or \
? ? ? ? ? ? (getminZiMu(an) == 'a' and an[6] == 'c') or (getminZiMu(an) == 'd' and an[6] == 'd')
#題8
def func8(an):
? ? return (abs(ord(an[0]) - ord(an[6])) != 1 and an[7] == 'a') or (abs(ord(an[0]) - ord(an[4])) != 1 and an[7] == 'b') or \
? ? ? ? ? ? (abs(ord(an[0]) - ord(an[1])) != 1 and an[7] == 'c') or (abs(ord(an[0]) - ord(an[9])) != 1 and an[7] == 'd')
#題9
def func9(an):
? ? ? t1 = (an[0] == an[5])
? ? ? equalT1 = lambda x: an[x] != an[4]
? ? ? return (an[8] == 'a' and? t1 == equalT1(5)) or (an[8] == 'b' and? t1 == equalT1(9)) or \
? ? ? ? ? ? ? (an[8] == 'a' and? ti == equalT1(1)) or (an[8] == 'a' and? ti == equalT1(8))
#獲取重復(fù)最多的答案的個(gè)數(shù)
def getmaxCount(an):
? ? nums = [0,0,0,0]
? ? for a in an:
? ? ? ? index = abs(ord('a') - ord(a))
? ? ? ? v = nums[index] + 1
? ? ? ? nums[index] = v
? ? return max(nums)
#獲取重復(fù)最少的答案的個(gè)數(shù)
def getminCount(an):
? ? nums = [0,0,0,0]
? ? for a in an:
? ? ? ? index = abs(ord('a') - ord(a))
? ? ? ? v = nums[index] + 1
? ? ? ? nums[index] = v
? ? return min(nums)
#題10
def func10(an):
? ? value = getmaxCount(an) - getminCount(an)
? ? return ( value == 3) or? (value == 2) or? (value == 4) or? (value == 1)
3.便利所有答案 ?找出滿足所有條件的答案
matchAnswers = []
for an in allanswers:
? ? #遍歷所有答案 滿足所有條件
? ? if func2(an) and func3(an) and func4(an) and? func5(an) and func6(an) and func7(an) and func8(an)? and func9(an) and func10(an):
? ? ? ? matchAnswers.append(an)
print('可能的結(jié)果%d'%len(matchAnswers))
for ans in matchAnswers:
? ? print(ans)
4.結(jié)果 只有一個(gè)如下
#1
#['b', 'c', 'a', 'c', 'a', 'c', 'd', 'a', 'b', 'a']