http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004
用到的主要是回溯,递归时先将所有字符放入栈中,在回溯时判断字符是否出栈并记录路径。栈是用字符数组模拟的。
另外这题的输出有点扯,每一行的最后一个i或o后面是有空格的,不需要处理,PE一次。
code:
#include<cstdio>
#include<cstring>
using namespace std ;
char str[50] ;
char bstr[50], estr[50], ans[100] ;
int blen, temp, h, r ;
void dfs(int bpos, int epos, int count){
if(epos==blen){
int i ;
for(i=0; i<count; i++)
printf("%c ", ans[i]) ;
printf("\n") ;
}
if(bpos<blen){
str[r++] = bstr[bpos] ;
ans[count] = 'i' ;
dfs(bpos+1, epos, count+1) ;
r -- ;
}
if(h!=r&&estr[epos]==str[r-1]){
char a = str[r-1] ;
r -- ;
ans[count] = 'o' ;
dfs(bpos, epos+1, count+1) ;
str[r++] = a ;
}
}
int main(){
while(~scanf("%s%s", bstr, estr)){
blen = strlen(bstr) ;
h = r = 0 ;
printf("[\n") ;
dfs(0, 0, 0) ;
printf("]\n") ;
}
return 0 ;}
#include<cstring>
using namespace std ;
char str[50] ;
char bstr[50], estr[50], ans[100] ;
int blen, temp, h, r ;
void dfs(int bpos, int epos, int count){
if(epos==blen){
int i ;
for(i=0; i<count; i++)
printf("%c ", ans[i]) ;
printf("\n") ;
}
if(bpos<blen){
str[r++] = bstr[bpos] ;
ans[count] = 'i' ;
dfs(bpos+1, epos, count+1) ;
r -- ;
}
if(h!=r&&estr[epos]==str[r-1]){
char a = str[r-1] ;
r -- ;
ans[count] = 'o' ;
dfs(bpos, epos+1, count+1) ;
str[r++] = a ;
}
}
int main(){
while(~scanf("%s%s", bstr, estr)){
blen = strlen(bstr) ;
h = r = 0 ;
printf("[\n") ;
dfs(0, 0, 0) ;
printf("]\n") ;
}
return 0 ;}