问大佬们一个问题
查看原帖
问大佬们一个问题
412042
gyy20081201楼主2023/1/26 14:14
#include<bits/stdc++.h>
using namespace std;
int s,t,w;
map<char,int> mp;
char eng[27]={'#','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
string st,s1;
bool flag=0;
int main(){
    scanf("%d%d%d",&s,&t,&w);
    cin>>st;
    st[w]=s1[w]='@';
    for(int i=1;i<=26;i++) mp[eng[i]]=i;
    mp['@']=100;
    for(int sb=1;sb<=5;sb++){
        flag=0;
        for(int i=w-1;i>=0;i--){
            if(st[i]==eng[t])continue;
            for(int j=mp[st[i]]+1;j<=t;j++){
                if(j<mp[st[i+1]]&&j>mp[st[i-1]]){
                    s1[i]=eng[j];
                    for(int k=i+1;k<w;k++){
                        s1[k]=eng[mp[s1[k-1]]+1];
                    }

                    for(int k=i-1;k>=0;k--){
                        s1[k]=st[k];
                    }
                    for(int i=0;i<w;i++){
                        if(!(s1[i]>=eng[s]&&s1[i]<=eng[t])) return 0;
                    }
                    for(int i=0;i<w;i++) cout<<s1[i];
                    cout<<endl;
                    for(int i=0;i<w;i++) st[i]=s1[i];
                    s1.erase(0);
                    flag=1;
                    break;
                }
            }
            if(flag) break;
        }

    }
}

以上这段代码在输入

4 24 17

dfghijklmopqrtuvw

的时候第一个jam数的输出是

dfghijklmopqrtuvx

但以下两段代码对此数据的输出是

dfghijklmopqrtuv

(后面那个是个神奇的符,显示不出来) 两段代码:

#include<bits/stdc++.h>
using namespace std;
int s,t,w;
map<char,int> mp;
char eng[27]={'#','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
string st,s1;
bool flag=0;
int main(){
    scanf("%d%d%d",&s,&t,&w);
    cin>>st;
    st[w]=s1[w]='@';
    for(int i=1;i<=26;i++) mp[eng[i]]=i;
    mp['@']=100;
    for(int sb=1;sb<=5;sb++){
        flag=0;
        for(int i=w-1;i>=0;i--){
            if(st[i]==eng[t])continue;
            for(int j=mp[st[i]]+1;j<=t;j++){
                if(j<mp[st[i+1]]&&j>mp[st[i-1]]){
                    s1[i]=eng[j];
                    for(int k=i+1;k<w;k++){
                        s1[k]=eng[mp[s1[k-1]]+1];
                    }

                    for(int k=i-1;k>=0;k--){
                        s1[k]=st[k];
                    }

                    flag=1;
                    break;
                }
            }
            if(flag){
                for(int i=0;i<w;i++) cout<<s1[i];
                cout<<endl;
                break;
            }
        }

        for(int i=0;i<w;i++) st[i]=s1[i];
        s1.erase(0);
    }
}

以及:

#include<bits/stdc++.h>
using namespace std;
int s,t,w;
map<char,int> mp;
char eng[27]={'#','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
string st,s1;
bool flag=0;
int main(){
    scanf("%d%d%d",&s,&t,&w);
    cin>>st;
    st[w]=s1[w]='@';
    for(int i=1;i<=26;i++) mp[eng[i]]=i;
    mp['@']=100;
    for(int sb=1;sb<=5;sb++){
        flag=0;
        for(int i=w-1;i>=0;i--){
            if(st[i]==eng[t])continue;
            for(int j=mp[st[i]]+1;j<=t;j++){
                if(j<mp[st[i+1]]&&j>mp[st[i-1]]){
                    s1[i]=eng[j];
                    for(int k=i+1;k<w;k++){
                        s1[k]=eng[mp[s1[k-1]]+1];
                    }

                    for(int k=i-1;k>=0;k--){
                        s1[k]=st[k];
                    }

                    flag=1;
                    break;
                }
            }
            if(flag) break;
        }
        for(int i=0;i<w;i++) cout<<s1[i];
        cout<<endl;
        for(int i=0;i<w;i++) st[i]=s1[i];
        s1.erase(0);
    }
}

请问这是为什么

2023/1/26 14:14
加载中...