谁作案了?

谁作案了?

问题描述:
某地刑侦大队对涉及6个嫌疑人的一桩疑案进行分析:

  1. 至少1个人作案;

  2. A、E、F这3个人中至少2个人参与作案;

  3. A、D不可能是同案犯;

  4. C或B同时作案,或都与本案无关;

  5. C、D中有且仅有1个人作案;

  6. 如果D没有参与作案,则E也不可能参与作案

请找出作案人。

思路

  1. 推理已知正确答案为:ABCF,DEF
  2. 递归实现指数型枚举//例题

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;
} 
posted @ 2022-12-06 22:16  Keith-  阅读(48)  评论(1编辑  收藏  举报