[ブルーブリッジカップ] [アルゴリズムのトレーニングVIP]単語ソリティア(DFS +文字列)

タイトル説明
、要件は(各最長の「ドラゴン」の文字で始まる単語ソリティアは、私たちのソリティア同じようなゲームをプレイするために使用さイディオムで、そして今、私たちは言葉のセットを知っている、と冒頭に手紙を与えられました言葉はほとんど一緒に重複する部分の一部になり、そして獣驚かは、例えば、列車に接続されている場合はbeastonishなる二つの単語、に接続されている場合、2つの追加の隣接する部分が存在することができない)で2回「ドラゴン」に表示されています包含関係は、例えば、atide時との間に接続することができません。

サンプル記述
一緒に「龍」にはatoucheatactactouchooseです

入力
最初の行為入力の単一の整数N(N <= 20)は、単語の数を表すn個の列の各々は、ワード線、単一の入力文字の最後の行を有する、冒頭に文字「ドラゴン」を表します。あなたは、これは文字「竜」で始まるが存在しなければならないと仮定することができます。
出力
出力の長さの最長の「龍」はこれだけの文字で始まる
サンプル入力
5
AT
タッチ
チート
選択
TACT
A
サンプル出力
23個
のアイデアを:データの量ではありません大きな、そして我々は、すべての可能な検索です。それは二度ほとんどで発生するので、その資格を追加します。ここで私は特にSUBSTR関数の内部で、あなたは百度に自分自身を理解することができない、便利な傍受のための文字列型、文字列型を使用します。
コードは以下の通りであります:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=21;
string s[maxx];
int vis[maxx];
int n;

inline void dfs(string t,int &_max)
{
	if(t.length()>_max) _max=t.length();
	string gg,kk;
	for(int i=1;i<t.length();i++)
	{
		gg=t.substr(t.length()-i);
		for(int j=1;j<=n;j++)
		{
			kk=s[j].substr(0,gg.length());
			if(kk==gg&&vis[j]<2)
			{
				vis[j]++;
				dfs(t+s[j].substr(kk.length()),_max);
				vis[j]--;
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) cin>>s[i];
	char c[2];
	scanf("%s",c);
	int _max=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i][0]==c[0])
		{
			memset(vis,0,sizeof(vis));
			vis[i]++;
			dfs(s[i],_max);
		}
	}
	printf("%d\n",_max);
	return 0;
}

ああを給油する、(O)/〜

公開された601元の記事 ウォン称賛51 ビュー50000 +

おすすめ

転載: blog.csdn.net/starlet_kiss/article/details/105225945
おすすめ