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