ZJU 1004 有注释,大侠请进!
Viali 2003-09-13 05:26:32 偶的回溯很烂,程序写出来了,得不到结果,请大侠们帮忙改正,谢谢了....
#include<iostream>
#include<string>
using namespace std;
#define max 100 //最长字符长度 max
char source[max], target[max], stack[max],tem[max],operate[2*max];
//tem数组是记录在operate操作下最终得到的结果,若tem==target则,operate序列输出
int len;
void output()
{
for(int i=0;i<2*len;i++)
cout<<operate[i]<<" ";
cout<<endl;
}
void search(int p,int s,int i,int t)
//source[p]将要处理,stack[s]、tem[i]、operate[t]已存在
{
if(s>= len || i>= len || t>=2*len) return ;
if( p>= len)
{
while(s!=-1)// 将堆栈中的东西全部出栈
{
tem[i++]=stack[s];
operate[t++]='o';
s--;
}
tem[len]=target[len];
if(strcmp(tem,target)==0)
output();
}
operate[t+1]='i';//可以选择source[p]先进栈
stack[s+1]=source[p];
search(p+1,s+1,i,t+1);
if(s!=-1)//即 若栈不为空,栈顶元素可以选择先出栈,然后再处理source[p]
{
operate[t+1]='o';
tem[i+1]=stack[s];
search(p,s-1,i+1,t+1);
}
}
int main()
{
while(cin>>source>>target)
{
len=strlen(source);
cout<<"["<<endl;
//--------------------------------------
search(0,-1,-1,-1);//调用
//--------------------------------------
cout<<"]"<<endl;
}
return 1;
}