HRBUST2030(dfs)
阿新 • • 發佈:2017-07-22
-c math cas bitset bsp lin ng- printf n)
每一個成語由至少三個至多8個漢字組成,假設前一個成語的最後一個字和後一個成語的第一個字同樣,那麽就能夠接到一起。
為了將問題簡化,每一個漢字用4個字母編碼取代。保證每一個漢字的都有唯一的編碼。全部字母均為小寫字母,且以第一個成語為開始成語, 每一個成語僅僅能夠使用一次。
第一行是一個整數N。代表有N個成語。
接下來N行,每行一個成語。
(N <= 20)
成語接龍
Time Limit: 1000 MS Memory Limit: 32768 KB
64-bit integer IO format: %lld , %llu Java class name: Main
[Submit] [
c=problem-status&problem_id=131971" style="background-color:transparent; color:rgb(66,139,202); text-decoration:none">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)