51NOD 1523 非回文

1523 非回文

//https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1523

从后往前扫的做法有问题,因为后面字符更改的话再改前面的字符会有后效性.
应从前往后扫,记录是否更改过前面的字符.

#include<bits/stdc++.h>
using namespace std;
int N,P;
char Str[1005],Ans[1005];
bool Solve(int pos,bool flag)
{
    int i;
    if (pos==N)
        return 1;
    if (flag)
        i=0;
    else
    {
        i=Str[pos];
        if (pos==N-1)
            i++;
    }
    for (;i<P;i++)
    {
        if ((pos>0&&i==Ans[pos-1])||(pos>1&&i==Ans[pos-2]))
            continue;
        Ans[pos]=i;
        if (i>Str[pos])
            flag=true;
        if (Solve(pos+1,flag))
            return true;
    }
    return false;
}
int main()
{
    cin>>N>>P;
    cin>>Str;
    for (int i=0;i<N;i++)
        Str[i]=Str[i]-'a';
    if (Solve(0,false))
    {
        for (int i=0;i<N;i++)
            Ans[i]=Ans[i]+'a';
        cout<<Ans;
    }
    else
        cout<<"NO";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值