変貌
件名の説明:
スペル場合:彼はハーマイオニーがすべての呪文を覚えることができるようにしませんでしたし、カジュアルな野球がハリネズミか何かになるだろうが、彼は変形マントラの統一の法則を発見したので、ええと...変形クラスハリーは、少し問題に走りました単語のb終わりから始まるが、その役割は正確にBオブジェクトになりオブジェクトです。
ハリーは彼がテーブルの列となっていたすべての呪文を持って、彼は助けを計算するにはあなたを望んでいる彼ができたかどうかM(マウス)への完全な教師の仕事、B(ボールが)、あなたは彼がそれを完了することができないならば、彼はハーマイオニーを依頼しなければならなかった、と真実を学ぶために多くのことを聞くことを余儀なく、知っています。
入力:
テストデータの複数のセット。各グループ内の複数の行を1行に1つずつワードは、小文字のみを含む、すべての呪文ハリー意志数字0は、入力のセットの終わりを示します。
出力:
ハリーは彼の宿題を終えることができました場合は、出力が「はい。」、それ以外の場合は出力「いいえ」(Doが完全に停止を無視しません)
SAMPE入力:
サンプル出力:
アイデアの分析:
この質問は同じ単語ソリティアと同じですが、私たちはまず、文字Bの先頭を識別それらを記録した後、手紙の最後には条件を満たすために手紙メートルで依頼する必要がありますので、申請の対象は、文字bで始まるからです。この質問を入力するには不快な、書き込みにそう利用ベクター構造、何も言わなかったが、私は書くことができない、唯一のアレイを拡張することができます。我々は条件を満たすことができるかどうかは、実際に私たちは大丈夫でした。この質問は、入力条件を設定言いませんでした、それは連続的な出力であることが必要であり、多くの問題があり、╮(╯▽╰)╭。
ACコード:
使用時:46msを
#include<cstdio>
#include<string.h>
char c1[10000][20];//记录单词
int d[10000];//记录b开头单词所出现的序号
int e[10000];//标记是否用过该单词
int g=0;//记录有多少个单词
int flag,flag1;//flag标记是否能够接龙成功,这个flag1也和flag差不多
void LemonDFS(char c2)
{
int i;
if(flag)//这里是为了缩短运行时间,一旦达到要求了,后面就不用在继续DFS
{
return;
}
for(i=0;i<g;i++)//分三种情况去看
{
if(c1[i][strlen(c1[i])-1]=='m'&& c2=='m')//如果第一个找到m开头,就退出
{
flag=1;
return;
}
if(c2==c1[i][0] && c1[i][strlen(c1[i])-1]=='m' && e[i]!=1)//如果找到 m开头就退出
{
flag=1;
return;
}
if(c2==c1[i][0] && e[i]!=1)//如果接龙可以,并且没使用过该单词,就DFS下去
{
e[i]=1;//标记用过该数字
LemonDFS(c1[i][strlen(c1[i])-1]);
if(flag)//剪枝,缩短时间
return;
e[i]=0;
}
}
}
int main()
{
int b=0,c=0;
while(scanf("%s",c1[g])!=EOF)//为了持续输入,这里就吐了
{
flag=0;
flag1=0;
if(c1[g][0]=='0')
{
for(b=0;b<c;b++)//记录单词
{
e[d[b]]=1;//记录
LemonDFS(c1[d[b]][strlen(c1[d[b]])-1]);//传b字母进去
if(flag)
{
printf("Yes.\n");
flag1=1;
break;
}
e[d[b]]=0;
}
if(!flag1)
printf("No.\n");
memset(c1,0,sizeof(c1));
memset(e,0,sizeof(g));
memset(d,0,sizeof(d));
g=0;
continue;
}
if(c1[g][0]=='b')//记录b开头的单词
{
d[c++]=g;
}
g++;
}
}