题目地址:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=506
题目描述:
Pizza Anyone? |
You are responsible for ordering a large pizza for you and your friends. Each of them has told you what he wants on a pizza and what he does not; of course they all understand that since there is only going to be one pizza, no one is likely to have all their requirements satisfied. Can you order a pizza that will satisfy at least one request from all your friends?
The pizza parlor you are calling offers the following pizza toppings; you can include or omit any of them in a pizza:
Input Code | Topping |
A | Anchovies |
B | Black Olives |
C | Canadian Bacon |
D | Diced Garlic |
E | Extra Cheese |
F | Fresh Broccoli |
G | Green Peppers |
H | Ham |
I | Italian Sausage |
J | Jalapeno Peppers |
K | Kielbasa |
L | Lean Ground Beef |
M | Mushrooms |
N | Nonfat Feta Cheese |
O | Onions |
P | Pepperoni |
Your friends provide you with a line of text that describes their pizza preferences. For example, the line
+O-H+P;
reveals that someone will accept a pizza with onion, or without ham, or with pepperoni, and the line
-E-I-D+A+J;
indicates that someone else will accept a pizza that omits extra cheese, or Italian sausage, or diced garlic, or that includes anchovies or jalapenos.
A pizza constraint is a list of 1 to 12 topping constraint lists each on a line by itself followed by a period on a line by itself.
A topping constraint list is a series of topping requests terminated by a single semicolon.
An topping request is a sign character (+/-) and then an uppercase letter from A to P.
Toppings: ACFO
If no combination toppings can be found which satisfies at least one request of every person, your program should print the string
No pizza can satisfy these requests.
on a line by itself starting in column 1.
+A+B+C+D-E-F-G-H; -A-B+C+D-E-F+G+H; -A+B-C+D-E+F-G+H; . +A+B+C+D; +E+F+F+H; +A+B-G; +O+J-F; +H+I+C; +P; +O+M+L; +M-L+P; . +A+B+C+D; +E+F+F+H; +A+B-G; +P-O; +O+J-F; +H+I+C; +P; +O; +O+M+L; -O-P; +M-L+P; .
Toppings: Toppings: CELP No pizza can satisfy these requests.题意:
让所有人满意,其中每个人满足其中至少一个需求即可。
题解:
刚开始读这道题的时候感觉很简单,直接爆搜 看能不能过,但做得过程中,发现每个样例如果有满足所有人的情况,其字符串的答案不止一种,然后又受了样例输出的误导,以为要取满足情况中字符串长度最小的,然后看到字母序又以为要取所有串中,排序最靠前的那个答案串。并且读题没看到它说这题是special judge,在那纠结老半天,最后莫名其妙地1y,感觉这道题真真莫名其妙 也没考虑什么剪枝,直接搜就是,得到一个答案立即退出整个DFS。还有这题还真就是special judge。。。。。
我是以人为深度进行深搜,然后再存储形式上用了一维整数数组来表示A~P的喜好问题,然后以人为深度深搜下去,只要至少满足一个人的其中一个喜好就行了,直接跳到下个人的搜索中,到最后一个人,如果发现满足情况直接跳出整个DFS,输出答案就行,注意答案要字母顺序。其他没有什么限制条件。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <iostream> #include <algorithm> #define LL 16//ABCDEFGHIJKLMNOP using namespace std; char instr[50+5]={'\0'}; int prefre[26+5]={0};//-1 is without 1 is with 0 is not refer to this int prefres[20+5][26+5]={0};//input the prefres int prefrescnt=0;//maze 's count char minstr[26+5]={'\0'};//output this or cmp for this char prestr[26+5]={'\0'};//preference string but not must be minstr int flag=0;//whether find the case satisfy all people at least one constraint /*switch the string to the prefres int array*/ int switchpre(char str[],int ind) { int i=0; while(str[i]!=';') { if(isupper(str[i])) { if(str[i-1]=='+') prefres[ind][str[i]-'A']=1; else prefres[ind][str[i]-'A']=-1; } i++; } return(0); } /*switch the array to string*/ int switchstr(char str[],int pre[]) { int i=0,k=0; str[0]='\0'; for(i=0;i<=LL-1;i++) { if(pre[i]==1) { str[k]=i+'A'; k++; } } str[k]='\0'; return(0); } /*DFS the people constraint*/ int DFS(int cur) { if(flag) return(0); if(cur==prefrescnt) { switchstr(prestr,prefre); memcpy(minstr,prestr,sizeof(prestr)); flag=1; return(0); } else { int i=0; for(i=0;i<=LL-1;i++)//pick a 1 or -1 add to the prefre array { if(prefres[cur][i]!=0) { if(prefre[i]==0) { prefre[i]=prefres[cur][i]; DFS(cur+1); if(flag) return(0); prefre[i]=0; } else if(prefre[i]==prefres[cur][i])//this privilege is higher than prefre[i]==0 { DFS(cur+1); if(flag) return(0); } } } } return(0); } /*for test*/ int test() { return(0); } /*main process*/ int MainProc() { while(scanf("%s",instr)!=EOF) { //init memset(prefre,0,sizeof(prefre)); memset(prefres,0,sizeof(prefres)); memset(minstr,'Z',sizeof(minstr)); memset(prestr,'\0',sizeof(prestr)); prefrescnt=0; switchpre(instr,prefrescnt); prefrescnt++; while(scanf("%s",instr)!=EOF&&instr[0]!='.') { switchpre(instr,prefrescnt); prefrescnt++; } flag=0; DFS(0);//the depth is people constraint if(flag) { printf("Toppings: %s\n",minstr ); } else { printf("No pizza can satisfy these requests.\n"); } } return(0); } int main(int argc, char const *argv[]) { /* code */ MainProc(); return 0; }