シミュレーションスタックの遡及,完全二叉木探索,(ZOJ 1004)
4904 ワード
タイトルリンク:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004
問題解決レポート:
①方法:完全二叉木の探索方式、遡及法.
②コード解釈:
1、ずっとスタックに入ることができて、スタックに入ることができない时、スタックを出るしかありません.
2、先にスタックに入ってから、スタックを出ます.スタックが空にならないようにします.
3、dfs(i,j)が完了した後(i>1)、スタックアウト操作が可能になった場合、dfs(i,j+1)を行い、答えに近づく.
問題解決レポート:
①方法:完全二叉木の探索方式、遡及法.
②コード解釈:
1、ずっとスタックに入ることができて、スタックに入ることができない时、スタックを出るしかありません.
2、先にスタックに入ってから、スタックを出ます.スタックが空にならないようにします.
3、dfs(i,j)が完了した後(i>1)、スタックアウト操作が可能になった場合、dfs(i,j+1)を行い、答えに近づく.
#include <iostream>
#include <string>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std;
string a,b;/// ;
stack <char> build;///
vector <char> operate;///
int len;/// a
///iPush ,iPop ;
void dfs(int iPush,int iPop)
{
/// , 。
if(iPush==len&&iPop==len)
{
for(int i=0;i<operate.size();i++)
cout<<operate[i]<<" ";
cout<<endl;
}
/// ;
if(iPush+1<=len)
{
build.push(a[iPush]);
operate.push_back('i');
dfs(iPush+1,iPop);
build.pop();
operate.pop_back();
}
/// ;
if(iPop+1<=iPush&&iPop+1<=len&&build.top()==b[iPop])
{
char tc=build.top();
build.pop();
operate.push_back('o');
dfs(iPush,iPop+1);
build.push(tc);
operate.pop_back();
}
}
int main()
{
while(cin>>a>>b)
{
len=a.length();
cout<<"["<<endl;
dfs(0,0);
cout<<"]"<<endl;
}
return 0;
}