比赛 20120914 评测结果 AWAWEWWW
题目名称 著名医生的药方 最终得分 25
用户昵称 TBK 运行时间 0.076 s
代码语言 C++ 内存使用 1.28 MiB
提交时间 2012-09-14 21:50:19
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#include <set>
#include <algorithm>
using namespace std;
int a[501][500],b,c,d,l,m,n,r[500],t,k[501],j[501],s;
string str;
bool bo[501],boo[501];
void DFS1(int x)
{
	int y,z;
	if (r[l]==0) 
	{
		r[l]=x;
		l++;
		if (l==b)
		{
			s++;
			if (bo[r[l]]!=true) r[l]=0;
			l--;
			return ;
		}
		for (y=0;y<j[x];y++)
			if (k[a[x][y]]==0)
			{
				for (z=0;z<j[x];z++) k[a[x][z]]++;
				DFS1(a[x][y]);
				for (z=0;z<j[x];z++) k[a[x][z]]--;
				
			}
		if (bo[r[l]]!=true) r[l]=0;
		l--;
	}
		else 
		{
			if (r[l]!=x) return ;
				else 
				{
					r[l]=x;
					l++;
					if (l==b)
					{
						s++;
						return ;
					}
					for (y=0;y<j[x];y++)
						if (k[a[x][y]]==0)
						{
							for (z=0;z<j[x];z++) k[a[x][z]]++;
							DFS1(a[x][y]);
							for (z=0;z<j[x];z++) k[a[x][z]]--;
						}
					if (bo[r[l]]!=true) r[l]=0;
					l--;
				}
		}
}
void DFS(int x)
{
	
	int y,z;
	if (r[l]==0) 
	{
		r[l]=x;
		l++;
		if (l==b)
		{
			for (y=0;y<b;y++) printf("%d ",r[y]);
			printf("\n");
			if (bo[r[l]]!=true) r[l]=0;
			l--;
			return;
		}	
		for (y=0;y<j[x];y++)
			if (k[a[x][y]]==0)
			{
				for (z=0;z<j[x];z++) k[a[x][z]]++;
				DFS(a[x][y]);
				for (z=0;z<j[x];z++) k[a[x][z]]--;
			}
			if (bo[r[l]]!=true) r[l]=0;
			l--;
	}
		else 
		{
			if (r[l]!=x) return ;
				else 
				{
					r[l]=x;
					l++;
					if (l==b)
					{
						for (y=0;y<x;y++) printf("%d ",r[y]);
						printf("\n");
						return;
					}
					for (y=0;y<j[x];y++)
						if (k[a[x][y]]==0)
						{
							for (z=0;z<j[x];z++) k[a[x][z]]++;
							DFS(a[x][y]);
							for (z=0;z<j[x];z++) k[a[x][z]]--;
						}
						if (bo[r[l]]!=true) r[l]=0;
						l--;
				}
		}
}
int main(void)
{
	freopen ("doctor.in","r",stdin);
	freopen ("doctor.out","w",stdout);
	scanf("%d",&b);
	getline(cin,str);
	for (c=1;c<=b;c++)
	{
		getline(cin,str);
		t=0;
		l=0;
		for (d=0;d<str.length();d++)
			if (str[d]!=' ')
			{
				t*=10;
				t+=str[d]-'0';
			}
				else 
				{
					a[c][l]=t;
					t=0;
					l++;
				}
		a[c][l]=t;
		l++;
		j[c]=l;
	}
	d=b;
	scanf("%d",&b);
	for (c=0;c<b;c++) 
	{
		scanf("%d",&r[c]);
		if (r[c]!=0) bo[r[c]]=true;
	}
	for (c=1;c<=d;c++) 
	{
		if ((bo[r[0]]==true)&&(c==1))
		{
			c=r[0];
			l=0;
			k[c]++;
			DFS(c);
			k[c]--;
			break;
		}
		r[0]=0;
		l=0;
		k[c]++;
		DFS1(c);
		k[c]--;
	}
	printf("%d\n",s);
	for (c=1;c<=d;c++) 
	{
		if ((bo[r[0]]==true)&&(c==1))
		{
			c=r[0];
			l=0;
			k[c]++;
			DFS(c);
			k[c]--;
			break;
		}
		r[0]=0;
		l=0;
		k[c]++;
		DFS(c);
		k[c]--;
	}	
	fclose(stdin);
	fclose(stdout);
	return 0;
}