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