您的位置:首页 > 其它

ZOJ 1004 : Anagrams by Stack 体验回溯搜索

2008-07-02 20:58 597 查看
这一题就是要把一个输入串仅仅通过栈的入栈和出栈操作转化为另一个串。初看此题,我感觉非常难以下手,不知道该如何是好。 仔细分析题目中的两个串之间有什么规律,时间花了很多的,但是一点效果都没有。请教了一位ACM很牛的同学。他马上就说了一句话,直击题目的核心。就是你不用电脑,只用纸和笔,你会怎么算呢?是的,如果我只用纸和笔,我会怎么做呢?我想对于madam和adamm这两个串来说,当然就是先入m,然后在入a,然后弹出a,然后重复此过程直到找到一种出栈、入栈序列为止。他说,你把你的这个思考过程转化成代码,让电脑能够执行不就行了吗?

下面是我的代码。代码的执行过程就是边入栈,边匹配,匹配了就出栈,不匹配就继续入栈,直到找到所有的可能的入栈、出栈序列为止。为了能够找到所有可能的序列,还需要在递归搜索过程中,从递归函数返回时恢复原来的环境,以便能够继续搜索。

#include <iostream>
#include <string>
#include <stack>
#include <fstream>
using namespace std;

char *pSrc = NULL, *pDest = NULL;
stack<char> s1;
char res[1000];
int cnt = 0;

void Try()
{
if (*pDest == '/0') {
for (int i = 0; i != cnt; ++i) {
cout << res[i];
if (i != cnt - 1)
cout << ' ';
}
cout << endl;
}
if (!s1.empty()) {
char c = s1.top();
if (c == *pDest) {
s1.pop();
res[cnt++] = 'o';
++pDest;
Try();
s1.push(c);
--cnt;
--pDest;
}
}
if (*pSrc != '/0') {
s1.push(*pSrc);
res[cnt++] = 'i';
++pSrc;
Try();
s1.pop();
--cnt;
--pSrc;
}
}

int main()
{
ifstream cin("data");
string strSrc, strDsti;
while (cin >> strSrc >> strDsti) {
pSrc = const_cast<char*>(strSrc.c_str());
pDest = const_cast<char*>(strDsti.c_str());
cout << '[' << endl;
Try();
cout << ']' << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: