求助,调了一个月了
查看原帖
求助,调了一个月了
453460
End1essSummer楼主2021/11/28 09:16

代码中nex数组表示下一个的进位,(因为stl里有一个next,用next会报错,所以就换成了nex)nu布尔数组表示哪个数用没用过,init是初始化,总而言之就可以把它看为离散化+翻转

那个hh代表的是换行

#include<bits/stdc++.h>
using namespace std;
int a[30],b[30],c[30],nex[30];
int num[30],n;
string sta,stb,stc;
bool nu[30];
void init(){
    for(int i=1;i<=n;i++){
        a[i]=(sta[n-i]-'A')+1;
        b[i]=(stb[n-i]-'A')+1;
        c[i]=(stc[n-i]-'A')+1;
    }return;
}void dfs(int nowa){
    for(int i=1;i<nowa;i++){
        if(num[b[i]]==-1||num[c[i]]==-1){
            continue;
        }else{
            int t=num[a[i]]+num[b[i]];
            if((t+1)%n!=num[c[i]]&&(t)%n!=num[c[i]]){
                return;
            }
        }
    }if(nowa==n+1){
        for(int i=1;i<=n;i++){
            int nowa=num[a[i]],nowb=num[b[i]],nowc=num[c[i]],nexup=(nowa+nowb+nex[i])/n;
            nex[i+1]=nexup; 
            if(nexup==1&&i==n) return;
            else{
                if((nowa+nowb+nex[i])%n!=nowc){
                    return;
                }
            }
        }for(int i=1;i<=n;i++){
            cout<<num[i]<<" ";
        }exit(0);
    }else{
        for(int i=0;i<=n-1;i++){
            if(!nu[i]){
                nu[i]=true;
                num[a[nowa]]=i;
                dfs(nowa+1);
                num[a[nowa]]=-1;
                nu[i]=false;
            }
        }
    }
}int main(){
    cin>>n;
    char hh=getchar();
    getline(cin,sta);
    getline(cin,stb);
    getline(cin,stc);
    for(int i=n-1;i>=0;i--){
        num[i]=-1;
    }init();
    dfs(1);
    return 0;
}
2021/11/28 09:16
加载中...