推导:dfs
递归时记录步长的参数非常重要,既然涉及到dfs和bfs,肯定需要纵向的步长参数和横向的步长参数,本题用的是in(纵向)和out(横向)。 设计:
dfs(
in
,
out
)
{
dfs( in + 1 , out );
dfs( in , out + 1 );
}
{
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 ;
}
#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 ;
}