【ZOJ1004】Anagrams by Stack

来源: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;
}

 

posted @ 2010-09-27 16:34  屠一刀  阅读(484)  评论(1编辑  收藏  举报