ZOJ 1004 Anagrams by Stack

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 }

 

转载于:https://www.cnblogs.com/jinjin-2018/p/8972358.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值