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;
}