解题思路:本题讲述的是让你输入两个字符串序列,判断能否通过对第一个字符串进行进栈出栈操作得到第二个字符串,若能则输出所有能达到的进出栈操作过程。我通过全排列每得到一组操作过程,则用函数按照这个操作过程,判断能否得到第二个字符串,若能则表明此操作过程可行,输出。
#include<stdio.h>
#include<string.h>
int n,n1,n2; //总操作数,进栈操作数,出栈操作数
char in[1000]; //第一个输入的字符串,/***被操作字符串***/
char ou[1000]; //第二个输入字符串,/*需判断能否经操作字符串操作后得到的字符串*/
char reu[1000];
int judge(int len) //判断两个字符串是否含有相同种类和个数的字符
{
int i;
char ch1[26]={0},ch2[26]={0};
for(i=0;i<len;i++)
{
ch1[in[i]-'a']=ch1[in[i]-'a']+1; //统计第一个字符串中不同种类字符串的个数和种类
ch2[ou[i]-'a']=ch2[ou[i]-'a']+1;
}
if(strcmp(ch1,ch2)==0) //判断函数
return 1;
return 0;
}
int caozuo()
{
int i,j,k,t;
char ch[1000];
for(i=0,j=0,k=0,t=0;i<n;i++)
{
if(reu[i]=='i') //进栈操作
{
ch[j]=in[k];
j++;
k++;
}
else
{
if(ch[j-1]==ou[t]) //出栈时判断是否和需判断序列一致
{
j--;
t++;
}
else
return 0; //判断不成立,返回不成立
}
}
return 1;
}
void full_permutation(int L)
{
int i;
if (n1==0&&n2==0) //当进栈出栈数都没有时,及全部都用于操作以后
{
if(caozuo()) //调用操作函数按照得到的操作过程进行操作,并判断
{
for(i=0;i<n;i++)
printf("%c ",reu[i]); //当前操作可以,输出当前操作序列
printf("\n");
}
return;
}
if(n1>0)
{
reu[L]='i'; //在l位置放上进栈操作
n1--;
full_permutation(L+1); //填下一个位置
n1++;
}
if(n2>n1) //剩余的进栈操作是否少于出栈操作,即表明当前如果进行出栈操作,栈里面还有字符,操作合法
{
reu[L]='o'; //在l位置放上出栈操作
n2--;
full_permutation(L+1); //填下一个位置
n2++;
}
}
int main()
{
while(scanf("%s",in)!=EOF) //输入字符串
{
getchar(); //吸收回车符
gets(ou); //输入第二个字符串
printf("[\n");
int len1,len2;
len1=strlen(in); //求字符串的长度
len2=strlen(ou);
if(len1==len2) //如果两个字符串长度不一致那可以肯定绝对不行
{
if(judge(len1)) //调用函数,判断两个字符串所含字符种类,个数是否一致,原因如上条解释
{
n=len1*2; //因为一个字符有进出栈两个操作,所以操作数是字符串长度的两倍
n1=len1; //得到进栈操作数
n2=len1;
full_permutation(0);//操作全排列
}
}
printf("]\n");
}
return 0;
}
分享到:
相关推荐
标题“ZOJ1014.zip_zoj code_zoj1004”表明这是一个与ZOJ(ZeroJudge)在线判题系统相关的代码压缩包,其中可能包含了解决ZOJ问题1004的源代码。ZOJ是面向编程爱好者和学生的一个在线编程竞赛平台,它提供了各种算法...
深度搜索 回溯 int main { string s1 s2; while cin >> s1 >> s2 { count 0; cout << "[" << endl; if s1 length s2 length BackTrake s1 s2 ;... [更多]
zoj_1004.cpp 求单词字母进出栈后能形成目标串的进出方案 广度优先搜索求解
【踩气球问题】是一个基于逻辑推理的游戏,用于考察编程者如何处理真假信息以及数值比较。在这个问题中,两个小朋友分别踩了若干个编号为1到100的气球,然后报告他们踩到的气球编号的乘积。游戏的目标是通过分析他们...
12. *踩气球(ZOJ1004) 实验三:搜索 1. Floodfill 2. 电子老鼠闯迷宫 3. 跳马 4. 独轮车 5. 皇宫小偷 6. 分酒问题 7. *找倍数 8. *8数码难题 实验四:动态规划 1. 最长公共子序列 2. 计算矩阵连乘积 3. 凸多边形的...
此外,PPT还通过一些ZOJ(在线判题系统)的题目来具体展示如何应用这些数据结构和STL,如ZOJ1004-Anagrams by Stack、ZOJ1094-Matrix Chain Multiplication等,这些题目可以帮助学习者加深理解并提高实战技能。...
入门ACM竞赛,首先可以通过各大高校的在线测评网站,如北京大学的POJ或浙江大学的ZOJ,进行训练。新手通常从简单的题目开始,比如POJ上的1000、1003、1004、1046、1207、1226、1504、1552等题目。在熟悉平台后,可...
1004 1006 1007 专题分类 (一)简单搜索 ID Problem C++ Source 1 HDU 2553 (精简版) 2 HDU 1312 3 POJ 3984 4 POJ 2251 5 POJ 3278 6 POJ 3279 7 ZOJ 1002 8 POJ 1321 9 HDU 1241 (二)树 ID Problem C++ Source 1 ...
1004 1006 1007 专题分类 (一)简单搜索 ID Problem C++ Source 1 HDU 2553 (精简版) 2 HDU 1312 3 POJ 3984 4 POJ 2251 5 POJ 3278 6 POJ 3279 7 ZOJ 1002 8 POJ 1321 9 HDU 1241 (二)树 ID Problem C++ Source 1 ...
ZJU_Main 主页 下一页 ZJU 题型分类 文演整理版 2008-3-23 数论: 1007 Numerical Summation of a Series 简单题,还是蛮有意思的 1045 HangOver 简单题 ... 1049 I Think I Need a Houseboat 简单题 ...