一份烧脑的推理题,PHP编程轻松解决

一份烧脑的推理题,PHP编程轻松解决

推理问卷如下

原始问卷

解题程序

<?php
/*
*刑侦推理试题求解程序
*作者:littlezhuhui
*[email protected]
*2019-6-8
*/

//存放10道题答案的全局数组
$questionAnswer=[];

//模拟做题过程的函数,$n表示题号
function question($n){ 
	global $questionAnswer;
	$answerOption=['a','b','c','d'];
	foreach ($answerOption as $answer ) {
		$questionAnswer[$n]=$answer;
		if($n<10){ 
			//如果未到最后一题,做下一题
			question($n+1);
		}else{ 
			//10道题全部做完,检查是否合理
			if(check()){ 
				//输出结果
				var_export($questionAnswer);
				echo "\n";
			}
		}
	}
}

//检查答案是否合理
function check(){ 
	global $questionAnswer;

	$q2Option=['a'=>'c','b'=>'d','c'=>'a','d'=>'b'];
	if($q2Option[$questionAnswer[2]]!=$questionAnswer[5]){ 
		return false;
	}

	$q3Option=['a'=>3,'b'=>6,'c'=>2,'d'=>4];
	foreach ($q3Option as $answer => $qNum) {
		if($answer!=$questionAnswer[3]){ 
			if($questionAnswer[$qNum]==$questionAnswer[$q3Option[$questionAnswer[3]]]){ 
				return false;
			}
		}
	}

	$q4Option=['a'=>[1,5],'b'=>[2,7],'c'=>[1,9],'d'=>[6,10]];
	$qNums=$q4Option[$questionAnswer[4]];
	if($questionAnswer[$qNums[0]]!=$questionAnswer[$qNums[1]]){ 
		return false;
	}
	
	$q5Option=['a'=>8,'b'=>4,'c'=>9,'d'=>7];
	if($questionAnswer[$q5Option[$questionAnswer[5]]]!=$questionAnswer[5]){ 
		return false;
	}

	$q6Option=['a'=>[2,4],'b'=>[1,6],'c'=>[3,10],'d'=>[5,9]];
	$qNums=$q6Option[$questionAnswer[6]];
	foreach ($qNums as $qNum ) {
		if($questionAnswer[$qNum]!=$questionAnswer[8]){ 
			return false;
		}
	}
	
	$q7Option=['a'=>'c','b'=>'b','c'=>'a','d'=>'d'];
	$minMaxLetter = minMaxLetter();
	if(!array_key_exists($q7Option[$questionAnswer[7]], $minMaxLetter[0])){ 
		return false;
	}

	$q8Option=['a'=>7,'b'=>5,'c'=>2,'d'=>10];
	if(adjacent($questionAnswer[$q8Option[$questionAnswer[8]]],$questionAnswer[1])){ 
		return false;
	}

	$q9Option=['a'=>6,'b'=>10,'c'=>2,'d'=>9];
	$qNum=$q9Option[$questionAnswer[9]];
	$c1=$questionAnswer[1]==$questionAnswer[6];
	$c2=$questionAnswer[$qNum]==$questionAnswer[5];
	if($c1==$c2){ 
		return false;
	}

	$q10Option=['a'=>3,'b'=>2,'c'=>4,'d'=>1];
	if($q10Option[$questionAnswer[10]]!=$minMaxLetter[2]){ 
		return false;
	}

	return true;
}

//10个答案中出现次数最少及最多的字符
function minMaxLetter(){ 
	global $questionAnswer;
	
	$counter=['a'=>0,'b'=>0,'c'=>0,'d'=>0];
	foreach ($questionAnswer as $answer) {
		
		$counter[$answer]++;
	}

	$min=100;
	$max=-100;
	foreach ($counter as $answer=>$n) {
		if($n<=$min){ 
			if($n==$min){
				$minLetter[$answer]=$n;
			}else{
				$minLetter = [];
				$minLetter[$answer]=$n;
			}
			$min = $n;
		}
		if($n>=$max){ 
			if($n==$max){
				$maxLetter[$answer]=$n;
			}else{
				$maxLetter = [];
				$maxLetter[$answer]=$n;
			}
			$max = $n;
		}
	}
	//返回[出现次数最少的字符集,出现次数最多的字符集,最多次数与最少次数的差值]
	return [$minLetter,$maxLetter,$max-$min];
}

//判断两个字符是否相邻
function adjacent($a,$b){ 
	return abs(ord($a)-ord($b))==1;
}

echo 'Begin to solve ...',"\n";
//开始计时
$beginTime = time();
//求解
question(1);
//输出耗用的时间
echo 'used time: ',time()-$beginTime,' seconds',"\n";

猜你喜欢

转载自blog.csdn.net/littlezhuhui/article/details/92396691
今日推荐