社区讨论

MnZn 20pts求助,不知道哪里出问题了

P1139单向双轨道参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2lw9h55
此快照首次捕获于
2024/10/23 21:12
去年
此快照最后确认于
2025/11/04 16:24
4 个月前
查看原帖
C
#include<bits/stdc++.h>
using namespace std;
const  int N = 16;
int n,vis[N];
char s[N];
int mp[N],pos[N],id[N],f[N],t[N],ans=1e9,ANSF[N],ANST[N],ANSID[N],stk[N][3],tp,tp2,tp3;
void dfs(int cnt,int num){
    if((cnt-1)>ans){
        return;
    }
    if(num==n){
        if((cnt-1)<ans){
            ans=cnt-1;
            for(int i=1;i<=cnt-1;i++){
                ANSF[i]=f[i];
                ANST[i]=t[i];
                ANSID[i]=id[i];
            }
        }
        return;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<=3;j++){
            if(pos[i]>=j) continue;
            if(j==3&&num+1!=mp[i]) continue;
            if(pos[i]==0){
                if(stk[tp][0]!=i) continue;
            }
            if(pos[i]==1){
                if(stk[tp2][1]!=i) continue;
            }
            if(pos[i]==2){
                if(stk[tp3][2]!=i) continue;
            }
            //cout<<char(i+'a')<<" "<<char(pos[i]+'A')<<" "<<char(j+'A')<<" "<<cnt<<endl;
            f[cnt]=pos[i];
            t[cnt]=j;
            id[cnt]=i;
            int tmp=pos[i];
            pos[i]=j;
            if(j==1){
                stk[++tp2][1]=i;
                tp--;
                dfs(cnt+1,num);
                pos[i]=tmp;
                tp2--;
                tp++;
            }
            else if(j==2){
                stk[++tp3][2]=i;
                if(tmp==0){
                    tp--;
                }
                else tp2--;
                dfs(cnt+1,num);
                pos[i]=tmp;
                if(tmp==0){
                    tp++;
                }
                else tp2++;
                tp3--;
            }
            else if(j==3){
                if(tmp==0){
                    tp--;
                }
                else if(tmp==1){
                    tp2--;
                }
                else if(tmp==2){
                    tp3--;
                }
                dfs(cnt+1,num+1);
                pos[i]=tmp;
                if(tmp==0){
                    tp++;
                }
                else if(tmp==1){
                    tp2++;
                }
                else if(tmp==2){
                    tp3++;
                }
            }
        }
    }
}
int main(){
    //freopen("P1139.in","r",stdin);
    //freopen("P1139.out","w",stdout);
    cin>>n;
    //cout<<n<<endl;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        mp[s[i]-'a']=n-i+1;
    }
    for(int i=0;i<=n-1;i++){
        stk[++tp][0]=i;
    }
    dfs(1,0);
    if(ans==1e9) cout<<"NO"<<endl;
    else{
        //cout<<ans<<endl;
        for(int i=1;i<=ans;i++){
            cout<<char(ANSID[i]+'a')<<" "<<char(ANSF[i]+'A')<<" "<<char(ANST[i]+'A')<<endl;
        }
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...