Uva 1610 Party Games

Thinking about it:

  刚开始思考的时候,脑子里就觉得这道题可能有很多情况,刚开始就因为考虑不周全wa了。

  后来换了一种思路,如果不能马上就直接得到答案,就一个一个字母去尝试。这样子就有点类似dfs了,比如 名字排序后排在中间的z字符串是 s1,,s2,那么第i位的字母肯定介于 s1[i] 和 s2[i] 之间,然后先判断在这里填一个字母能否得出答案。这里需注意:不能填了一个字母后就立马搜索下一个情况,因为题目首先要求是最短,所以要在不填下一个字母的情况下,把这个位置可能的字母都填上试试。发现必须要再填下一个字母时,才开始填写下一个字母。

 

PS:

  AC后看了看网上的题解,大多是多个if分析各种情况,这样确实更直接。但在分析不清时,可以考虑一下搜索。另,思考问题时,最好先在纸上写点想法,书写过程中很有可能带来灵感!

 

Code:

/**
 * AC @ Sep 9th 2015
 * Run Time : 0.000s
 */
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1000 + 50;
string name[MAXN], ans;
int N;

bool read() {
    cin >> N;
    if (!N) {
        return false;
    }
    for (int i = 0; i < N; ++i) {
        cin >> name[i];
    }
    return true;
}

bool dfs(int pos) {
    ans.append(1, '0');
    char start, limit;
    start = pos < name[N/2-1].length() ? name[N/2-1][pos] : 'A';
    limit = pos < name[N/2].length() ? name[N/2][pos] : 'Z';
    for (char c = start; c<=limit; ++ c) {
        ans[ans.length()-1] = c;
        if (ans >= name[N/2-1] && ans < name[N/2]) {
            return true;
        }
    }
    for (char c = start; c<=limit; ++ c) {
        ans[ans.length()-1] = c;
        if (dfs(pos + 1)) {
            return true;
        }
    }
    return false;
}

void work() {
    ans = "";
    sort(name, name + N);
    dfs(0);
    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    while (read()) {
        work();
    }
    return 0;
}
/**
 * Test case:
4
ACB 
ABC
ABB
ACC
2
ABAB
ABB
2 
ABABC
ABB
 */

 

  

 

posted @ 2015-09-09 22:51 Emerald 阅读(...) 评论(...) 编辑 收藏