记录编号 42783 评测结果 AATATTWA
题目名称 [ZSTU 2579] 著名医生的药方 最终得分 50
用户昵称 Gravatar苏轼 是否通过 未通过
代码语言 C++ 运行时间 3.999 s
提交时间 2012-09-29 14:46:27 内存使用 3.70 MiB
显示代码纯文本
#include <fstream>
using namespace std;
ifstream cin("doctor.in");
ofstream cout("doctor.out");
int n,p,a[501][501],yao[1001],ans=0,b[501],c[501],ct[501];
string st;
void init()
{
	int k=0,i;
	cin>>n;getline(cin,st);
	for (i=1;i<=n;i++)
	{
		while (cin.peek()!=10&&cin.peek()!=13) cin>>a[i][++k];
		getline(cin,st);c[i]=k;k=0;
	}
	cin>>p;
	for (i=1;i<=n;i++) {b[i]=0;ct[i]=-1;}
	for (i=1;i<=p;i++) 
	{
		cin>>yao[i];
		if (yao[i]!=0) 
		{
			b[yao[i]]=1;
			ct[yao[i]]=i;
		}
	}
}
bool keyi(int r,int x,int y)//判断r--x,y--r是否可行
{
	int i,j=1;
	if (b[r]!=0) return false;//r是否用过
	for (i=1;i<=c[y];i++)//r是否是y的后继
		if (r==a[y][i]) j=0;
	if (j==1) return false;
	j=1;//x是否是r的后继
	if (x!=0)
	{
		for (i=1;i<=c[r];i++)
			if (x==a[r][i]) j=0;
		if (j==1) return false;
	}
	return true;
}
bool keyi1(int r,int x,int y)//判断r--x,y--r是否可行
{
	int i,j=1;
	
	for (i=1;i<=c[y];i++)//r是否是y的后继
		if (r==a[y][i]) j=0;
	if (j==1) return false;
	j=1;//x是否是r的后继
	if (x!=0)
	{
		for (i=1;i<=c[r];i++)
			if (x==a[r][i]) j=0;
		if (j==1) return false;
	}
	return true;
}
bool hh(int step,int x)
{
	for (int i=1;i<=c[yao[step-1]];i++)
		if (ct[a[yao[step-1]][i]]>step) return 0;
	return 1;
}
void jia(int x)
{
	int i;
	for (i=1;i<=c[x];i++) b[a[x][i]]++;
	b[x]++;
}
void jian(int x)
{
	int i;
	for (i=1;i<=c[x];i++) b[a[x][i]]--;b[x]--;
}
void pd()
{
	for (int i=1;i<p;i++) cout<<yao[i]<<' ';
	cout<<yao[p]<<endl;
}
void dfs(int step)
{
	int r;
	if (step>p) ans++;else
	{
		if (yao[step]==0)
		{
			for (r=1;r<=n;r++)
			{
				if (step==1)
				{
					yao[1]=r;b[r]++;
					dfs(step+1);
					yao[1]=0;b[r]--;
				}else
				{
					if (keyi(r,yao[step+1],yao[step-1])&&hh(step,r))
					{
						jia(yao[step-1]);yao[step]=r;
						dfs(step+1);
						jian(yao[step-1]);yao[step]=0;
					}
				}
			}
		}else 
			if (keyi1(yao[step],yao[step+1],yao[step-1])&&hh(step,r)) 
				    {
					   for (int i=1;i<=c[yao[step-1]];i++) b[a[yao[step-1]][i]]++;
					   dfs(step+1);
					   for (int i=1;i<=c[yao[step-1]];i++) b[a[yao[step-1]][i]]--;
				    }
	}
}
void zdfs(int step)
{
	int r;
	if (step>p)
	{
		pd();
	}else
	{
		if (yao[step]==0)
		{
			for (r=1;r<=n;r++)
			{
				if (step==1)
				{
					yao[1]=r;b[r]++;
					zdfs(step+1);
					yao[1]=0;b[r]--;
				}else
				{
					if (keyi(r,yao[step+1],yao[step-1])&&hh(step,r))
					{
						jia(yao[step-1]);yao[step]=r;
						zdfs(step+1);
						jian(yao[step-1]);yao[step]=0;
					}
				}
			}
		}else
			if (keyi1(yao[step],yao[step+1],yao[step-1]))
				if (hh(step,r)) 
				   {
					   for (int i=1;i<=c[yao[step-1]];i++) b[a[yao[step-1]][i]]++;
					   zdfs(step+1);
					   for (int i=1;i<=c[yao[step-1]];i++) b[a[yao[step-1]][i]]--;
				   }
	}
}
int main()
{
	init();
	dfs(1);
	cout<<ans<<endl;
	zdfs(1);
	return 0;
}