著名医生的药方(深搜)

#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;
}

 

posted @ 2012-06-07 18:38  orangeblog  阅读(288)  评论(0编辑  收藏  举报