谁作案了?
谁作案了?
问题描述:
某地刑侦大队对涉及6个嫌疑人的一桩疑案进行分析:
-
至少1个人作案;
-
A、E、F这3个人中至少2个人参与作案;
-
A、D不可能是同案犯;
-
C或B同时作案,或都与本案无关;
-
C、D中有且仅有1个人作案;
-
如果D没有参与作案,则E也不可能参与作案
请找出作案人。
思路
- 推理已知正确答案为:ABCF,DEF
- 递归实现指数型枚举//例题
Code
点击查看代码
#include<iostream>
using namespace std;
bool st[7]; //ABCDEF
//123456
bool c1(){ //AEF至少两人作案
if(!st[1] && !st[5] || !st[1] && !st[6] || !st[5] && !st[6])return 0; //两人或以上不作案
return 1;
}
bool c2(){ //AD不能是共犯
if(st[1] && st[4])return 0; //AD共犯
return 1;
}
bool c3(){ //CD有且仅有一人作案
if(st[3] && st[4] || !st[3] && !st[4])return 0; //同时作案或者同时不作案
return 1;
}
bool c4(){ //如果D没有作案,E也不可能作案
if(!st[4] && st[5])return 0; //D没作案但E作案
return 1;
}
bool c5(){ //BC或同时作案,或都与本案无关
if(!st[2] && st[3] || st[2] && !st[3])return 0; //其中一人作案
return 1;
}
void dfs(int x){ //判断x是否是凶手
if(x > 6){
if(!c1() || !c2() || !c3() || !c4() || !c5())return ; //其中一个不满足
for(int i = 1; i <= 6; i ++){
if(st[i])cout << (char)(i + 'A' - 1)<< " ";
}
puts("");
return;
}
st[x] = 0; //x不是凶手
dfs(x + 1); //判断下一个是不是凶手
st[x] = 1; //x是凶手
dfs(x + 1);
}
int main(){
dfs(1); //判断A是否是凶手
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探