1143 字母转换

来源:互联网 发布:matlab求逆矩阵 编辑:程序博客网 时间:2024/05/21 06:50

字母转换

时限:1000ms 内存限制:10000K  总时限:3000ms

描述
通过栈交换字母顺序。给定两个字符串,要求所有的进栈和出栈序列(i表示进栈,o表示出栈),使得字符串2在求得的进出栈序列的操作下,变成字符串1。输出结果需满足字典序。例如TROT 到 TORT:
[
i i i i o o o o
i o i i o o i o
]
 
输入
给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串。
 
输出
所有的进栈和出栈序列,输出结果需满足字典序
 
输入样例
madam adamm bahama bahama long short eric rice
 
输出样例
                                     [
 i i i i o o o i o o 
 i i i i o o o o i o 
i i o i o i o i o o
 i i o i o i o o i o 
o i i i o o i i o o o i 
o i i i o o o i o i o i 
o i o i o i i i o o o i 
o i o i o i o i o i o i 
i i o i o i o o 
]
#include<iostream>#include<stack>#include<stdio.h>#include<string.h> using namespace std;char str1[100],str2[100];int rs[50];int num1,num2;stack<char>s; int search(int m);int test();void output();int main(){while(scanf("%s",&str1) != EOF){scanf("%s",&str2);//输入两个字符串 num1 = strlen(str1);num2 = strlen(str2); //计算两字符串长度while(!s.empty()){s.pop() ;}if(num1 != num2){cout<<"["<<endl<<"]"<<endl;; }else{cout<<"["<<endl;search(0);cout<<"]"<<endl;}} return 0;}int search(int m){int i; if(m == 2*num1) //递归结束 {if(test()){output();} }else{for(i = 1;i >= 0;i--){rs[m] = i;search(m+1);}}}int test(){int i,j = 0,k = 0,flag = 1,sum = 0;char temp[100];for(i = 0;i<2*num1;i++){sum=sum+rs[i];}if(sum!=num1){flag = 0;}for(i = 0;i < 2*num1;i++){if(rs[i] == 1){s.push(str1[j]);j++;}if(rs[i] == 0){if(j>k){temp[k] = s.top();s.pop();k++;}else{flag = 0;break;}}}for(k=0;k<num1;k++){if(temp[k] != str2[k]){flag = 0;break;}}return(flag);}void output(){int i ; for(i = 0;i < 2*num1-1;i++){if(rs[i] == 1){ cout<<"i "; }else{cout<<"o ";}}if(rs[2*num1] == 1){cout<<"i"<<endl;}else{cout<<"o"<<endl;}}


原创粉丝点击