题意:一些人提出自己喜欢的pizza的要求,问是否存在对所有人至少满足一个条件的要求。这里要注意的是不存在某人不喜欢的东西也算一条满足这个人的要求。
分析:一共有16种东西,深搜最多2^16。用一个数的二进制表示当前的选择。
Code:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxnn=100;
char str[maxnn][maxnn];
int main()
{
while(scanf("%s",str[0])!=EOF){
int n=1;
while(scanf("%s",str[n]),str[n++][0]!='.') ;
int status=0,maxnum=(1<<16)-1;
bool flag;
while(status<=maxnum){
flag=true;
for(int i=0;i<n-1;i++){
bool ok=false;
int pos=0;
while(pos<strlen(str[i])){
if(str[i][pos]=='+'){
if( ( status>> (str[i][pos+1]- 'A') )&1 ){
ok=true;
break;
}
}else if(str[i][pos]=='-'){
if( !((status >> (str[i][pos+1]-'A' ) )&1) ){
ok=true;
break;
}
}
pos+=2;
}
if(!ok){ flag=false;break;}
}
if(flag) break;
status++;
}
if(!flag) printf("No pizza can satisfy these requests.\n");
else {
int pos=0;
printf("Toppings: ");
while(pos<16){
if(status & 1) printf("%c",pos+'A');
status>>=1; pos++;
}
printf("\n");
}
}
return 0;
}