团体程序设计天梯赛(L3-015 球队“食物链” (30 分))

题目:

思路分析:

一个dfs+剪枝的题目:

直接用stl中的全排只能拿16分 

代码实现:

const int MAX=101;
int n;
int ans[MAX];
int vis[MAX];
int vs[MAX][MAX];
int flag=0;
int dfs(int pos,int num){
    if(pos>n){
        if(vs[ans[pos-1]][ans[1]]==1){
            flag=1;
            for(int i=1;i<=n;i++){
                if(i==1) cout<<ans[i];
                else   cout<<" "<<ans[i];
            }
            return 1;
        }
        return 0;
    }
    int ans1;
    bool cut=false;
        for(int i=1;i<=n;i++)
            if(!vis[i]&&vs[i][1]==1&&i!=1)
                cut=true;
        if(!cut) return false;
    for(int i=1;i<=n;i++){
        if(!vis[i]&&vs[num][i]==1){
            vis[i]=1;
            ans[pos]=i;
            ans1=dfs(pos+1,i);
            if(ans1) break;
            vis[i]=0;
        }
    }
    return ans1;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        getchar();
        for(int j=1;j<=n;j++){
            char c;
            cin>>c;
            if(c=='W'||c=='-'){
                vs[i][j]=1;
            }
            else if(c=='L')
                vs[j][i]=1;
        }
    }
    flag=0;
    dfs(1,1);
    if(!flag) cout<<"No solution"<<endl;
}
const int MAX=21;
char a[MAX][MAX];
int b[MAX];
int n;
int flag=1;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }

    for(int i=1;i<=n;i++){
        b[i]=i;
    }
//    int num=1;
    do{
//        for(int i=1;i<=n;i++){
//            cout<<b[i]<<" ";
//        }
//        cout<<endl;
        flag=1;
//        cout<<num++<<endl;
        for(int i=2;i<=n;i++){
                if(a[b[i-1]][b[i]]!='W'){
                    flag=0;
                }
//            cout<<a[b[i-1]][b[i]];
        }
//        cout<<endl;
        if(flag==1&&a[b[n]][1]=='W'){
            for(int i=1;i<=n;i++){
                if(i==1) cout<<b[i];
                else cout<<" "<<b[i];
            }
            return 0;
        }
    }
    while (next_permutation(b+1,b+1+n));
    if(flag==0) cout<<"No Solution";
}

猜你喜欢

转载自blog.csdn.net/m0_57006708/article/details/121265491