题意 : 给你一个字符串,让你按照给定规则进行处理。
- 如果字符串里有字母或者是数字就忽略非字符数字,如果没有,就让最右边的那个字符+1.
- 增量都是从最右边的字母或者数字开始的。
- 增加一个数字的方法是加1到另一个数字('0' -> '1', '1' -> '2' ... '9' -> '0')。
- 增加一个大写字母的方法是加一位到另一个字母 ('A' -> 'B', 'B' -> 'C' ... 'Z' -> 'A')。
- 增加一个小写字母的方法是加一位到另一个字母('a' -> 'b', 'b' -> 'c' ... 'z' -> 'a')。
- 如果增加到了9或者z或者Z,就需要进位,进给它左边离它最近的字母或者数字
- 如果进位的时候前边没有字母或者数字了,就在这位的前边加一位,例如9进位之后要变为0,前边要加一个1,A前边加一个A,a前边加一个a。
英语太渣题意理解错wa无数次(生无可恋的表情)。附渣渣代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
using namespace std;
typedef long long ll;
const int MAXN=1000;
const ll INF=1e9;
const ll mod=1e9+7;
string s;
int x;
bool isan( char x ){
return (x>='0'&&x<='9')||( x>='A'&&x<='Z' )||( x>='a'&&x<='z' );
}
string addleft( char x ){
string tmp;
if(x>='0'&&x<='9')tmp="1";
else if( x>='A'&&x<='Z' )tmp="A";
else if( x>='a'&&x<='z' )tmp="a";
return tmp;
}
bool iscarry(char x){
return x=='9'||x=='z'||x=='Z';
}
char tocarry( char x ){
if( x=='9' )return '0';
if( x=='Z' )return 'A';
if( x=='z' )return 'a';
//return x=='9'||x=='z'||x=='Z';
}
bool check( int y ){
int flag=0;
for(int i=y;i>=0;i--){
if( isan(s[i]) )flag=1;
}
return flag==1;
}
void out(){
cout<<s<<endl;
}
int findpos(int pos){
int i;
for( i=pos;i>=0;i--){
if( isan(s[i]) )break;
}
return i;
}
void dfs(int pos,int num,int jinwei,int jiafa,int has,int jpos){
if(num>x)return ;
if( has&&jiafa&&jinwei==1 ){
if( iscarry(s[pos]) ){
s[pos]=tocarry(s[pos]);
if( check(pos-1) ){
int apos=findpos(pos-1);
dfs(apos,num,1,1,has,jpos);
}else{
s.insert(pos,addleft(s[pos]));
out();
dfs(jpos+1,num+1,0,1,has,jpos);
}
}
else{
s[pos]++;
out();
dfs(jpos,num+1,0,1,has,jpos);
}
}
if(has&&jiafa&&jinwei==0){
if( !iscarry(s[pos]) ){
s[pos]++;
out();
dfs(pos,num+1,0,1,has,jpos);
}
else{
dfs(pos,num,1,0,has,jpos);
}
}
if(has&&jinwei&&jiafa==0){
s[pos]=tocarry(s[pos]);
if( check(pos-1) ){
int apos=findpos(pos-1);
dfs(apos,num,1,1,has,pos);
}else{
s.insert(pos,addleft(s[pos]));
out();
dfs(pos+1,num+1,0,1,has,jpos);
}
}else if(has==0&&jiafa){
//dfs( pos,num,0,1, )
s[pos]++;
if( isan(s[pos]) )has=1;
out();
dfs(pos,num+1,0,1,has,jpos);
}
}
int main()
{
//freopen("A-large.in","r",stdin);
//freopen("A-large.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
cin>>s;
cin>>x;
//dfs(s.size()-1,0);
if( check(s.size()-1) ){
int tmp=findpos(s.size()-1);
dfs(tmp,1,0,1,1,tmp);
}else{
dfs( s.size()-1,1,0,1,0,s.size()-1 );
}
printf("\n");
}
return 0;
}