记录编号 92401 评测结果 AATATAAA
题目名称 [ZSTU 2579] 著名医生的药方 最终得分 75
用户昵称 Gravatardigital-T 是否通过 未通过
代码语言 C++ 运行时间 3.386 s
提交时间 2014-03-20 16:49:23 内存使用 0.33 MiB
显示代码纯文本
#include<fstream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
ifstream fi("doctor.in");
ofstream fo("doctor.out");
int n,m=0;
vector <int> p[510];
int dsum,d[510];
int cur[510];
int used[510]={0};
vector <vector <int> > ans;
void dfs(int x,int k)//将x放在k位置,保证可行k位可行
{
	if(d[k]&&used[x]>2)return;
	cur[k]=x;
	if(k==dsum)
	{
		vector <int> temp;
		for(int i=1;i<=dsum;i++)
			temp.push_back(cur[i]);
		ans.push_back(temp);
	}
	else
	{
		if(d[k+1])
		{
			vector <int> change;
			bool flag=false;
			for(unsigned int i=0;i<p[x].size();i++)
			{
				if(p[x][i]==d[k+1])flag=true;
				used[p[x][i]]++;
			}
			if(flag)
			{
				dfs(d[k+1],k+1);
			}
			for(unsigned int i=0;i<p[x].size();i++)
				used[p[x][i]]--;
		}
		else
		{
			vector <int> change;
			for(unsigned int i=0;i<p[x].size();i++)
			{
				if(!used[p[x][i]])change.push_back(p[x][i]);
				used[p[x][i]]++;
			}
			for(unsigned int i=0;i<p[x].size();i++)
				if(used[p[x][i]]==1)
					dfs(p[x][i],k+1);
			for(unsigned int i=0;i<p[x].size();i++)
				used[p[x][i]]--;
		}
	}
	cur[k]=d[k];
}
int main()
{
	fi>>n;
	string str;
	getline(fi,str);
	int temp;
	for(int i=1;i<=n;i++)
	{
		getline(fi,str);
		temp=0;
		for(unsigned int j=0;j<str.size();j++)
		{
			if('0'<=str[j] && str[j]<='9')
				temp=temp*10+str[j]-'0';
			else
			{
				//fo<<temp<<' ';
				if(temp!=0)
					p[i].push_back(temp);
				temp=0;
			}
		}
		//fo<<temp<<endl;
		if(temp!=0)
			p[i].push_back(temp);
		temp=0;
	}
	fi>>dsum;
	for(int i=1;i<=dsum;i++)
	{
		fi>>d[i];
		if(d[i]!=0)used[d[i]]++;
	}
	if(d[1])
		dfs(d[1],1);
	else
	{
		for(int i=1;i<=n;i++)
			if(!used[i])
			{
				used[i]++;
				dfs(i,1);
				used[i]--;
			}
	}
	fo<<ans.size()<<endl;
	for(unsigned int i=0;i<ans.size();i++)
	{
		for(int j=0;j<dsum;j++)
			fo<<ans[i][j]<<' ';
		fo<<endl;
	}
	return 0;
}