zoj1004-Anagrams by Stack

zoj1004-Anagrams by Stack ( DFS )

题链:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004

给定你一个字符串序列,题目希望你通过出栈入栈调整得到一个新的给定的排序方式.输出所有的解,入栈操作>出栈操作

以madam 转为 dadmm 为例:

开了三个域,一个存放madam  一个存放 adamm, 一个为栈区stack域。如果栈顶元素与目前匹配元素相同,那么操作有两个取向:继续入栈;弹出栈,匹配数目+1

终止条件就是匹配数目为字母长度或者栈空或者原字符串全部入栈。

这道题目告诉我们做dfs的时候呢对全局变量的控制要灰常小心!!!

拿stack而言,它本来是我存放的栈,一开始我这么写:

if(j+1 < len && i+1 < len ){
            stack[j+1] = source[1+i] ;
            get[l+1] = 'i' ;
            dfs( i+1 , j+1 , k , l+1 ) ;
        }
        if ( j < 0 ) return ;
        if( stack[j] == trans[k] ){
            temp = stack[j] ;
            get[l+1] = 'o' ;
            dfs( i , j - 1 , k + 1 , l + 1 ) ;
            //stack[j] = temp ;
        }

结果答案输出就出了问题,原因在于我在dfs循环的时候弹出了stack[j],然而我却没在递归结束之后将它置回,是的它在循环中被改变了...

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#define mann 100000
char source[mann] , trans[mann] , get[4*mann] ;
char stack[mann] ;
int len ;
void dfs( int i , int j , int k , int l )
{
    //printf(  "i=%d j=%d k=%d\n" , i , j , k ) ;
    int m ;
    char temp ;
    if( k == len ){
        for ( m = 0 ; m <= l ; m++ ){
            printf( "%c " , get[m] ) ;
        }
        printf( "\n" ) ;
    }//注意输出格式

    if( i >= len || j >= len  ) return ;
    else{
        if(j+1 < len && i+1 < len ){//继续入栈
            stack[j+1] = source[1+i] ;
            get[l+1] = 'i' ;
            dfs( i+1 , j+1 , k , l+1 ) ;
        }
        if ( j < 0 ) return ;
        if( stack[j] == trans[k] ){//弹栈
            temp = stack[j] ;
            get[l+1] = 'o' ;
            dfs( i , j - 1 , k + 1 , l + 1 ) ;
            stack[j] = temp ;
        }

    }

}
int main()
{
    int i , j , k , l;
    while ( scanf( "%s%s", source , trans ) != EOF ){
        printf( "[\n" ) ;
        if(strlen(source) != strlen(trans) ){
            printf( "]\n" ) ;
            continue;
        }
        i = 0; j = 0 ; k = 0 ;
        len = strlen( source ) ;
        stack[0] = source [0] ;
        get[0] = 'i' ;
        dfs( i , j , k , 0 ) ;
        printf( "]\n" ) ;

    }
    printf("Hello world!\n");
    return 0;
}

     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值