比赛 |
20111021 |
评测结果 |
AEAAAAAAWA |
题目名称 |
掷骰子 |
最终得分 |
80 |
用户昵称 |
Makazeu |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-10-21 20:48:40 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int N,S,E;
int r=0;
int Total=0;
class Rules
{
public:
int num;
int Num[100];
int Up[100];
Rules()
{
num=0;
for (int i=0;i<=99;i++)
{
Num[i]=0;
Up[i]=0;
}
}
}R[1000];
void init()
{
cin>>N>>S>>E;
char str[1000];
for (int i=1;i<=E;i++)
{
r++;
for (int j=0;j<=999;j++) str[j]='\0';
cin>>str;
int len=strlen(str);
int p=0;
int n1=0;
int n2=0;
int nt=0;
bool flag=true;
while (p<len)
{
if(str[p]>='0' && str[p]<='9')
{
nt=nt*10+str[p]-'0';
p++;
continue;
}
else
{
if (flag)
{
n1=nt;
nt=0;
}
if (!flag)
{
n2=nt;
nt=0;
}
if (str[p]=='x')
{
R[r].Num[R[r].num]=n1;
flag=!flag;
p++;
continue;
}
if (str[p]=='+')
{
R[r].Up[R[r].num]=n2;
flag=!flag;
p++;
R[r].num++;
continue;
}
}
}
n2=nt;
R[r].Up[R[r].num]=n2;
R[r].num++;
}
}
void debug()
{
cout<<r<<endl;
for (int i=1;i<=r;i++)
{
for (int j=0;j<R[i].num;j++)
cout<<i<<" "<<j<<" "<<R[i].Num[j]<<" "<<R[i].Up[j]<<endl;
}
}
class QUEUE
{
public:
int Nu;
int Touzi[9];
QUEUE()
{
Nu=0;
for (int i=0;i<=9;i++)
Touzi[i]=0;
}
};
QUEUE Q[2000000];
void check(int x)
{
int Want[10]={0};
for (int i=1;i<=N;i++)
{
Want[Q[x].Touzi[i]]++;
}
bool yes;
for (int i=1;i<=r;i++)
{
for (int j=0;j<R[i].num;j++)
{
yes=true;
if ( Want[R[i].Up[j]]< R[i].Num[j])
{
yes=false;
break;
}
}
if(yes)
{
Total++;
return;
}
}
}
void BFS()
{
int big=1;
int small=0;
Q[0].Nu=0;
while(small<big)
{
int TN=Q[small].Nu;
if (TN==N)
{
check(small);
small++;
continue;
}
int Need=TN+1;
for (int i=1;i<=S;i++)
{
for (int k=0;k<=TN;k++)
Q[big].Touzi[k]=Q[small].Touzi[k];
Q[big].Nu=Need;
Q[big].Touzi[Need]=i;
big++;
}
small++;
}
}
int main()
{
freopen("cowyotz.in","r",stdin);
freopen("cowyotz.out","w",stdout);
init();
BFS();
cout<<Total<<endl;
return 0;
}