Anagrams by Stack
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004
题意:通过堆栈实现将一个字符串转变成目标字符串的操作,要求输出全部的可能操作组合。
思路:利用深度优先的搜索思路,对于每一个状态都有入栈和出栈两种可能的操作,由于要求按字典序输出,每次先考虑入栈再考虑出栈。即“能入就入,不能入考虑是否能退,随后返回上一步”。
下面贴代码:
1 //Problem Name: Anagrams by Stack 2 //Source: ZOJ 1004 3 //Author: jinjin18 4 //Main idea: DFS 5 //Language: C++ 6 //========================================================= 7 #include<stdio.h> 8 #include<string.h> 9 10 char origin[1000]; 11 char target[1000]; 12 char temp[1000]; 13 int top = -1; 14 char opt[2005]; 15 int iopt; 16 int popn,pushn; 17 int len; 18 void DFS(){ 19 if(popn == len){ 20 for(int i = 0; i < 2*len; i++){ 21 printf("%c ",opt[i]); 22 } 23 printf("\n"); 24 return ; 25 } 26 27 if(pushn < len){ 28 top++; 29 temp[top] = origin[pushn]; 30 pushn++; 31 opt[iopt] = 'i'; 32 iopt++; 33 DFS(); 34 iopt--; 35 top--; 36 pushn--; 37 } 38 39 if(popn < pushn&& temp[top] == target[popn]){ 40 top--; 41 popn++; 42 opt[iopt] = 'o'; 43 iopt++; 44 DFS(); 45 iopt--; 46 top++; 47 popn--; 48 temp[top] = target[popn]; //恢复现场 49 } 50 return ; 51 } 52 53 int main(){ 54 55 56 while(scanf("%s%s",origin,target)!=EOF){ 57 popn = pushn = 0; 58 iopt = 0; 59 len = strlen(origin); 60 printf("[\n"); 61 DFS(); 62 printf("]\n"); 63 } 64 65 return 0; 66 }