变形课

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 29518 Accepted Submission(s): 10683

Problem Description

呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.

Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.

Input

测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.

Output

如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)

Sample Input

so

soon

river

goes

them

got

moon

begin

big

0

Sample Output

Yes.

Hint

Hint

Harry 可以念这个咒语:"big-got-them".

Source

Gardon-DYGG Contest 1

【分析】:给出一堆单词,看能不能找到 一个或几个单词相连,使得首字母为b,末字母为m,假设能够输出YES,否则NO。 假设几个单词相连,要求相邻单词首末字母同样,如 big got them.思路是建立状态表,边输入边建立表。 比方单词ab,则c[0][1]=1。输入结束后,初步的表建立完毕,那么连接单词,就要查找,依据状态表。

找以b开头的单词,b-a,b-c,b-d.....z。最多找25次。找到一个break调,比方找到了a,然后再找以a开头的单词,循环26次,假设找到,比方c,那么状态表上则连接起来,c[1][0]=1

c[0][3]=1 c[1][3]=1 。最后所有查找完。仅仅要推断c[1][12]的状态就能够了,是1则YES。否则NO。

#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
using namespace std; typedef long long ll;
typedef unsigned long long ULL;
typedef pair<int,int> P;
const int INF = 0x3f3f3f3f;
const ll LNF = 1e18;
const int maxn = 1e3 + 100;
const int maxm = 100;
const double PI = acos(-1.0);
const double eps = 1e-8;
//const int dx[] = {-1,1,0,0,1,1,-1,-1};
//const int dy[] = {0,0,1,-1,1,-1,1,-1};
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
// 上/右/下/左
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int dir[6][3]={ {0,0,1},{0,0,-1},{-1,0,0},{1,0,0},{0,1,0},{0,-1,0} };
//int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
char s[1005];
int G[30][30];
int v[30];
int flag; void dfs(int cur)
{
if(cur==13)
{
flag=1;
return ;
}
else
{
for(int i=1;i<=26;i++)
{
if(!v[i] && G[cur][i])
{
v[i]=1;
dfs(i);
v[i]=0;
}
}
}
} int main()
{
while(~scanf("%s",s))
{ memset(G,0,sizeof(G));
memset(v,0,sizeof(v));
G[s[0]-'a'+1][s[strlen(s)-1]-'a'+1]=1;
while(scanf("%s",s) && strcmp(s,"0"))
G[s[0]-'a'+1][s[strlen(s)-1]-'a'+1]=1;
flag=0;
v[2]=1;
dfs(2);
if(flag)
printf("Yes.\n");
else
printf("No.\n");
}
}
/*
so
soon
river
goes
them
got
moon
begin
big
0
*/

[BFS]

#include <cstdio>
#include <queue>
#include <cstring> using namespace std; char s[1005];
int a[30][30];
int v[30];
int flag ; void bfs() {
queue<int> q;
q.push(2);
v[2] = 1;
while(!q.empty())
{
int head = q.front();
q.pop();
for(int i = 1;i <= 26;++i)
{
if(a[head][i] && !v[i])
{
if(i == 13)
{
flag = 1;
return ;
}
q.push(i);
v[i] = 1;
}
}
}
}
int main() {
while(~scanf("%s",s))
{
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
a[s[0] - 'a' + 1][s[strlen(s) - 1] - 'a' + 1] = 1;
while(scanf("%s",s) && strcmp(s,"0"))
a[s[0] - 'a' + 1][s[strlen(s) - 1] - 'a' + 1] = 1;
flag = 0;
bfs();
if(flag)
printf("Yes.\n");
else
printf("No.\n");
}
return 0;
}

最新文章

  1. 如何在Eclipse中查看JDK以及JAVA框架的源码(转载)
  2. iOS GCD 编程小结
  3. SQL知识整理三:变量、全局变量、视图、事务、异常
  4. BP神经网络
  5. VS生成事件宏$(TargetPath) 一直为空
  6. POJ1144Network(求割点个数)
  7. Junit4常用注解
  8. 关于Android Studio升级到2.0后和Gradle插件不兼容的问题
  9. mysql 支持emoji
  10. 【HDU 3038】 How Many Answers Are Wrong (带权并查集)
  11. SQLServer 2008的组成
  12. 第二次冲刺spring会议(第三次会议)
  13. qt添加资源文件方法
  14. javascript中快速求数组的全部元素的相加之和
  15. 01-oracle学习环境配置
  16. kubelet集群网络配置flannel(覆盖网络)
  17. Python中的鸡肋多线程
  18. js中的全局变量
  19. 原生js--userData
  20. Java ReentrantLock和synchronized两种锁定机制的对比

热门文章

  1. hdu 1207 汉诺塔II (DP+递推)
  2. [HDU5956]The Elder
  3. warning LNK4070的解决办法
  4. BZOJ2120 数颜色 【带修改莫队】
  5. oracle与mysql的group by语句
  6. AngularJs学习——模拟用户登录的简单操作
  7. 封装常用的Javascript跨浏览器方法
  8. HDFS的xshell及dfsadmin命令
  9. RPC-整体概念
  10. JAVA程序打包成exe文件详细图解