码迷,mamicode.com
首页 > 其他好文 > 详细

HRBUST2030(dfs)

时间:2014-11-02 12:31:50      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:dfs

成语接龙

Time Limit: 1000 MS Memory Limit: 32768 KB

64-bit integer IO format: %lld , %llu Java class name: Main

[Submit] [Status] [Discuss]

题目链接:http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=131971

Description

给出N个成语,通过成语接龙,求接出最长龙的成语个数。
每个成语由至少三个至多8个汉字组成,如果前一个成语的最后一个字和后一个成语的第一个字相同,那么就可以接到一起。
为了将问题简化,每个汉字用4个字母编码代替。保证每个汉字的都有唯一的编码。所有字母均为小写字母,且以第一个成语为开始成语, 每个成语只可以使用一次。

Input

多组测试数据,对每组数据
第一行是一个整数N,代表有N个成语。
接下来N行,每行一个成语。
(N <= 20)

Output

输出最长长度

Sample Input

5
adfkejimejlsgkeh
emiemkwlcuhelmge
gkeheohowehiemie
lmgejoewijfeabcd
emiekejlwejdadfk

Sample Output

4


解题思路:
	这道题读题是个坎·····首先注意要存的是每个字符串的前4个字母和后四个字母,然后要注意每次接龙都是以第一个成语为开始。
	读题过后,就可以开始考虑求解了。题目要求输出最长长度,很明显会出现第一个单词取完取第三个单词,然后发现此时我可以连第二个单词这种情况,这就是一种回溯。所以以第一个单词为起点,用dfs把n-1个串搜一遍。
	这里又从LSJ那里学到一个好思想,把它想象成一棵树,最后求最深的高度。每次搜索时用vis做个标记,两个原则:(1)标记过的我不走(2)和当前key值相同的点我不走。
	每次更新max_cnt。注意递归时++step和1+step的区别。如果写成++step,那么会改变step的值,同层的节点高度会改变;反之,如果是1+step,那么step值不会变,当扫完一个节点后,可以按原来的step值访问同层的其他节点。

完整代码:
#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <climits>
#include <cassert>
#include <complex>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;

#pragma comment(linker, "/STACK:102400000,102400000")

typedef long long LL;
typedef double DB;
typedef unsigned uint;
typedef unsigned long long uLL;

/** Constant List .. **/ //{

const int MOD = int(1e9)+7;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;
const DB EPS = 1e-9;
const DB OO = 1e20;
const DB PI = acos(-1.0); //M_PI;
string str;
int n;
int vis[100001];
struct node
{
    string start;
    string ends;
}q[100001];
int max_cnt;
int dfs(int key , int step , int &max_cnt)
{

    for(int i = 0 ; i < n ; i ++)
    {
        if(vis[i] == 0 && i != key)
        {
            if(q[key].ends == q[i].start)
            {
                vis[i] = 1;
                int t = dfs(i , 1+step , max_cnt);
                vis[i] = 0;
                max_cnt = max(max_cnt , t);
            }
        }
    }
    return step;
}

int main()
{
    #ifdef DoubleQ
    freopen("in.txt","r",stdin);
    #endif

    while(~scanf("%d",&n))
    {

        for(int i = 0 ; i < n ; i ++)
        {
            cin >> str ;
            int len  = str.length();
            q[i].start = "";
            q[i].start += str[0];
            q[i].start += str[1];
            q[i].start += str[2];
            q[i].start += str[3];

            q[i].ends = "";
            q[i].ends += str[len-4];
            q[i].ends += str[len-3];
            q[i].ends += str[len-2];
            q[i].ends += str[len-1];

        }
        memset(vis , 0 , sizeof(vis));
        max_cnt = 0;
        vis[0] = 1;
        int step = 0;
        dfs(max_cnt , step , max_cnt);
        printf("%d\n",max_cnt+1);
    }
}


HRBUST2030(dfs)

标签:dfs

原文地址:http://blog.csdn.net/u013447865/article/details/40707713

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!