您的位置:首页 > 其它

UVA565订披萨,每个人提几个条件,至少满足每个人的一个条件的方案

2015-11-03 22:35 465 查看
这题,虽然简单,但是毕竟本人比较渣,说一下心酸历程,看到这题想了下就去敲代码,各种找bug,AC不了,然后就去参考别人

的代码,发现别人都是用位运算来做的,当然位运算的做法比较巧妙,然后就模仿着写了一发位运算的,然后AC,然后总感觉我一开始的

代码能AC,就继续找最开始的代码的bug,随便除了组样例,竟然阴差阳错的找到了bug,然后迅速的改了就AC了,慢慢的都是心酸,但至少

我的提交在VJ上时间是最短的,这波不亏。找了四个多小时的bug,我也是够了。

先说下我这题的输入写的稍微有些麻烦的,看不下去的可以自己改下输入,下面贴上位运算和dfs俩种方法的代码:

dfs:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<climits>
#include<vector>
#include<cfloat>
#include<queue>
#include<cctype>
#include<cstdlib>
#include<string>
#define LL long long
using namespace std;

int b[20],a[20][20];
int l,flag;
void dfs(int cur)
{
if(flag)
return;
if(cur==l)
{
cout<<"Toppings: ";
for(int i=0;i<20;i++)
if(b[i]==1)
printf("%c",'A'+i);
cout<<endl;
flag=1;
return;
}
for(int i=0;i<20;i++)
{
if(a[cur][i])<span style="white-space:pre">			</span>//就是这里一开始写的简单了,注意前面有和这个一样的要满足的条件的可以直接跳过。
{
if(b[i]==a[cur][i])
dfs(cur+1);
if(b[i]==0)
{
b[i]=a[cur][i];
dfs(cur+1);
b[i]=0;
}
}
}
}
int main()
{
string s;
while(cin>>s)
{
flag=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
l=0;
for(int i=1;i<s.length();i++)
{
int te=s[i]-'A';
if(s[i-1]=='+')
a[l][te]=1;
if(s[i-1]=='-')
a[l][te]=-1;
}
l++;
while(cin>>s&&s!=".")
{
for(int i=1;i<s.length();i++)
{
int te=s[i]-'A';
if(s[i-1]=='+')
a[l][te]=1;
if(s[i-1]=='-')
a[l][te]=-1;
}
l++;
}
dfs(0);
if(!flag)
cout<<"No pizza can satisfy these requests."<<endl;
}
return 0;
}


位运算:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<climits>
#include<vector>
#include<cfloat>
#include<queue>
#include<cctype>
#include<cstdlib>
#include<string>
#define LL long long
using namespace std;

int b[20],a[20][20],yes[20],no[20];
int l,flag;
int main()
{
string s;
while(cin>>s)
{
flag=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(yes,0,sizeof(yes));
memset(no,0,sizeof(no));
l=0;
for(int i=0;i<(int)s.length()-2;i+=2)
{
int te=s[i+1]-'A';
if(s[i]=='+')
a[l][te]=1;
if(s[i]=='-')
a[l][te]=-1;
}
l++;
if(s!=".")
{
while(cin>>s&&s!=".")
{
for(int i=0;i<(int)s.length()-2;i+=2)
{
int te=s[i+1]-'A';
if(s[i]=='+')
a[l][te]=1;
if(s[i]=='-')
a[l][te]=-1;
}
l++;
}
}
for(int i=0;i<l;i++)
{
for(int j=0;j<16;j++)
{
if(a[i][j]==1)
yes[i]|=(1<<j);
if(a[i][j]==-1)
no[i]|=(1<<j);
}
}
flag=0;
for(int i=0;i<(1<<16);i++)
{
int j;
for(j=0;j<l;j++)
{
if((yes[j]&i)||((~i)&(no[j])))
continue;
else
break;
}
if(j==l)
{
cout<<"Toppings: ";
int tem=i;
int k=0;
for(int k=0;k<16;k++)
if(i&(1<<k))
printf("%c",'A'+k);
cout<<endl;
flag=1;
break;
}
}
if(!flag)
cout<<"No pizza can satisfy these requests."<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: