uva 565 Pizza Anyone?

题目地址:

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 CodeTopping
AAnchovies
BBlack Olives
CCanadian Bacon
DDiced Garlic
EExtra Cheese
FFresh Broccoli
GGreen Peppers
HHam
IItalian Sausage
JJalapeno Peppers
KKielbasa
LLean Ground Beef
MMushrooms
NNonfat Feta Cheese
OOnions
PPepperoni

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.

Input 

The input consists of a series of pizza constraints.

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.

Output 

For each pizza constraint, provide a description of a pizza that satisfies it. A description is the string `` Toppings:  " in columns 1 through 10 and then a series of letters, in alphabetical order, listing the toppings on the pizza. So, a pizza with onion, anchovies, fresh broccoli and Canadian bacon would be described by:

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.

Sample Input 

+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;
.

Sample Output 

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值