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;
}
51NOD 1523 非回文
最新推荐文章于 2021-08-25 10:10:19 发布