zoj 3490 String Successor 模拟

题意 : 给你一个字符串,让你按照给定规则进行处理。

  • 如果字符串里有字母或者是数字就忽略非字符数字,如果没有,就让最右边的那个字符+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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值