著名医生的药方(深搜)
#include<iostream> using namespace std; int fw[50][50]; int know[50],res[50]; int p,n; int visited[50]; int flag[50]; int search(int f,int r) { int i; if(r>p) { cout<<res[1]; for(i=2;i<=p;i++) cout<<" "<<res[i]; cout<<endl; return true; } if(know[r]!=0&&know[r]!=f) return false; if(know[r]!=0&&know[r]==f&&visited[f]==0) { res[r]=know[r]; if(r>1) { for(i=1;i<=n;i++) if(fw[res[r-1]][i]!=0) { if(visited[fw[res[r-1]][i]]==0) visited[fw[res[r-1]][i]]=f; } else break; } for(i=1;i<=n;i++) if(fw[f][i]!=0) { if(search(fw[f][i],r+1)) break; } else break; if(r>1) { for(i=1;i<=n;i++) if(fw[res[r-1]][i]!=0) { if(visited[fw[res[r-1]][i]]==f) visited[fw[res[r-1]][i]]=0; } else break; } } else if(know[r]==0&&visited[f]==0&&flag[f]==0) { res[r]=f; visited[f]=f; if(r>1) { for(i=1;i<=n;i++) if(fw[res[r-1]][i]!=0) { if(visited[fw[res[r-1]][i]]==0) visited[fw[res[r-1]][i]]=f; } else break; } for(i=1;i<=n;i++) { if(fw[f][i]==0) break; else { int ff=fw[f][i]; if(search(ff,r+1)) break; } } visited[f]=0; if(r>1) { for(i=1;i<=n;i++) if(fw[res[r-1]][i]!=0) { if(visited[fw[res[r-1]][i]]==f) visited[fw[res[r-1]][i]]=0; } else break; } } return false; } int main() { while(cin>>n) { memset(flag,0,sizeof(flag)); memset(visited,0,sizeof(visited)); memset(fw,0,sizeof(fw)); int i; for(i=1;i<=n;i++) { int k,j; cin>>k; for(j=1;j<=k;j++) cin>>fw[i][j]; } cin>>p; for(i=1;i<=p;i++) { cin>>know[i];flag[know[i]]=1;} for(i=1;i<=n;i++) search(i,1); } return 0; }