记录编号 |
92401 |
评测结果 |
AATATAAA |
题目名称 |
[ZSTU 2579] 著名医生的药方 |
最终得分 |
75 |
用户昵称 |
digital-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;
}