【ZOJ1004】Anagrams by Stack
推导:dfs
递归时记录步长的参数非常重要,既然涉及到dfs和bfs,肯定需要纵向的步长参数和横向的步长参数,本题用的是in(纵向)和out(横向)。 设计:
dfs(in,out)
{
dfs(in+1,out);
dfs(in,out+1);
}bfs(in,out){bfs(in,out+1);bfs(in+1,out);}
由于需要回溯,因此要注意在执行一次搜索后将一些数据状态还原。
结构:stack(栈),vector(用来存放i或o)
void Prints()//输出一个解
void dfs(int in,int out)//in表示入栈的数量,out表示出栈的数量
代码:
#include <iostream>
#include <vector>
#include <stack>
#include <string>
using namespace std;
string s1,s2;
stack<char> cs;
vector<char> io;
int l;//当前案例,字符串的长度
void Prints()
{
for(int i=0;i<io.size();i++)
cout<<io[i]<<" ";
cout<<endl;
}
//in表示入栈数量,out表示出栈数量
void dfs(int in,int out)
{
char t;
if( in==l && out==l )//如果入栈和出栈数量都等于字符串长度,则表示已得到一个成功解
{
Prints();
return;
}
if( in<l )
{
cs.push(s1[in]);
io.push_back('i');
dfs(in+1,out);
cs.pop();
io.pop_back();
}
if( out<in && out <l && cs.top()==s2[out] )
{
t = cs.top();
cs.pop();
io.push_back('o');
dfs(in,out+1);
cs.push(t);
io.pop_back();
}
}
int main()
{
while(cin>>s1>>s2)
{
l=s1.length();
cout<<"["<<endl;
dfs(0,0);
cout<<"]"<<endl;
}
return 0;
}