该题如果是用笔和纸去推倒排除,确实要花不少时间。
但是通过程序来写 就是最基本的循环加匹配程序了。
思路
如果用程序来写的话 最简单直接的思路 就是 创建出所有的答案 (有4的10次方个),然后遍历所有答案看是否满足题目所给的条件,全部满足的剩下的都是正确答案。 按这种思路来写 基本所有的语言都能写 ,c ,c++ ,php++ ,swift,python,java ,通通都能写
正好前段时间稍微看了看python 所以 我就权当python基本语法练习题来写了,题目不难,重点是思路。看了下公众号,大概是用了python的约束库 所以就不用写创建所有答案的那部分。 不过整体思路都一样,毕竟这题目还是很直接的,下面看python代码
1.创建所有答案 循环或者递归创建
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
answers = ['a','b','c','d'] #四种答案
allanswers = [] #10道题的所有可能答案
#递归方式创建所有答案
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()
#创建的所有答案可能性应该是4的10次方
print(len(allanswers))
print(pow(4,10))
2.写出答案 需要满足的所有条件
#题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')
#获取重复最少的答案
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))
#获取重复最多的答案的个数
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)
#获取重复最少的答案的个数
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('可能的结果%d'%len(matchAnswers))
for ans in matchAnswers:
print(ans)
4.结果 只有一个如下
#1
#['b', 'c', 'a', 'c', 'a', 'c', 'd', 'a', 'b', 'a']