Description

考虑将如此安排在一个 3 x3 行列中的九个时钟:

目标要找一个最小的移动顺序次将所有的指针指向12点。 下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。 选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度。 移动方法 受影响的时钟 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI Example

[但这可能不是正确的方法,请看下面]

Input

第1-3行: 三个空格分开的数字,每个数字表示一个时钟的初始时间,3,6,9,12。 数字的含意和上面第一个例子一样。

Output

单独的一行包括一个用空格分开的将所有指针指向12:00的最短移动顺序的列表。 如果有多种方案,输出那种使的连接起来数字最小的方案。(举例来说5 2 4 6 < 9 3 1 1)。

Single Input

9 9 12

6 6 6

6 3 6

Single Output

4 5 8 9

自定义  状态  类型,并定义状态数组,而查找时使用哈希查找表。具体代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #define mem(a) memset(a,0,sizeof(a));
 4 using namespace std;
 5 typedef int State[9];//定义“状态”类型
 6 const int MAXN=320000;//定义最大状态
 7 const int MAXSIZE=100003;//哈希表的最大范围
 8 int head[MAXSIZE],fa[MAXN],next[MAXN],move[MAXN];//head为哈希表中的头结点,next为哈希值相同时组成的链表,fa时父节点,move记录变化时所取的值
 9 State st[MAXN];//状态数组,所有状态都保存在这里
10 const State goal={3,3,3,3,3,3,3,3,3};//目标状态,4个时间3,6,9,12依次转化为0,1,2,3;所以目标状态是9个3
11 const char mo[9][6]={"abde","abc","bcef","adg","bdefh","cfi","degh","ghi","efhi"};//移动的钟
12
13 void shuru()//输入并转化为0,1,2,3
14 {
15     mem(head);mem(next);//置0
16     int i;
17     for(i=0;i<9;i++){cin>>st[0][i];st[0][i]=st[0][i]/3-1;}
18 }
19 int hash(State& s)//定义哈希函数
20 {
21     int i,a=0;
22     for(i=0;i<9;i++)a=a*10+s[i];//随便算,比如把几个数字转化成9位数
23     return a%MAXSIZE;//确保哈希函数值是不超过表大小的非负正整数
24 }
25 bool insert(int a)//尝试插入
26 {
27     int h=hash(st[a]);
28     int u=head[h];
29     while(u)//从表头开始查找链表
30     {
31         if(memcmp(st[u],st[a],sizeof(st[a]))==0)return false;//找到了,插入失败
32         u=next[u];//顺着链表继续查找
33     }
34     next[a]=head[h];//插入到链表中
35     head[h]=a;
36     return true;
37 }
38 void print(int p)//打印
39 {
40     if(!fa[p]){cout<<move[p];return ;}
41     print(fa[p]);
42     cout<<" "<<move[p];
43 }
44 void bfs()//BFS宽搜
45 {
46     int rear=1,front=0;
47     for(;;)
48     {
49         State& s=st[front];
50         if(memcmp(s,goal,sizeof(goal))==0){print(front);cout<<endl;return ;}//一旦找到就打印并结束搜索
51         int i;
52         for(i=0;i<9;i++)//从1到9依次变化
53         {
54             State& t=st[rear];
55             memcpy(&t,&s,sizeof(s));
56             int len=strlen(mo[i]),j;
57             for(j=0;j<len;j++)
58                 t[mo[i][j]-'a']=(t[mo[i][j]-'a']+1)%4;
59             if(insert(rear)){move[rear]=i+1;fa[rear++]=front;}//可以插入,记录并队列尾加1
60         }
61         front++;
62     }
63 }
64 int main()
65 {
66     shuru();
67     bfs();
68     return 0;
69 }

转载于:https://www.cnblogs.com/gj-Acit/archive/2013/02/12/2910277.html

USACO1.4.2(The clocks)BFS相关推荐

  1. USACO1.4 The Clocks(clocks)

    2019独角兽企业重金招聘Python工程师标准>>> 使用暴力搜索,枚举所有移动方案,及时中止不合时方案来节省时间.到现在依旧不会使用更高级的搜索算法,下一步需要学习一下理论知识. ...

  2. 搜索专题-----bfs、dfs模板,栈,队列

    P1443 马的遍历 题目描述 有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步. 输入格式 输入只有一行四个整数,分别为 n,m,x,y. 输 ...

  3. HDU-1459.非常可乐(BFS )

    这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...

  4. 洛谷 P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib

    P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给 ...

  5. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  6. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  7. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  8. 数据结构--搜索BFS

    文章目录 广度优先搜索 典型例题 广度优先搜索 广度优先搜索类似于树的层次遍历过程.它需要借助一个队列来实现.如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1.v2. ...

  9. 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝

    题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...

最新文章

  1. 正则表达式匹配多个字符(*、+、?、{m}、{m,n})
  2. 根据ip获取用户地址-百度
  3. 算法---给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合
  4. linux 目录操作
  5. 【Infragistics教程】在javascript构造函数中创建基本继承
  6. 结合Composer 新版本PHP的开发方式
  7. linux驱动初探之字符驱动
  8. L2-024. 部落-PAT团体程序设计天梯赛GPLT
  9. XSD详解三 - 复合元素+总结篇
  10. 大连理工计算机基础作业2,大工18秋《计算机应用基础》在线测试2答案
  11. linux把mac格式化了,Mac上将树莓派已经写了系统的SD卡(磁盘)抹除、格式化
  12. 谈cntv.cn的启用
  13. Elasticsearch索引分片的数量及大小分配策略
  14. tukey是什么意思_turkey中文是什么意思怎么读(英语里这个TURKEY这个多义词解析)...
  15. Composer中的ThingWorx模型定义—建模
  16. 监控摄像机安装的正确位置是哪里
  17. 从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
  18. 定义一个表示学生信息的类Student,要求如下:
  19. 10岁男童高考566分8岁开发操作系统
  20. Android如何让APP进程常驻内存?

热门文章

  1. CUR分解算法及Python实现
  2. Pandas.DataFrame按行求百分数(比例数)
  3. 插入排序InsertionSort(Python实现)
  4. U盘加载速度慢的解决方法
  5. Spring Boot OAuth 2.0 客户端
  6. Gym 101128 B Black Vienna
  7. redis数据库入门
  8. SQL Server 2008 R2 开启数据库远程连接
  9. JavaWeb学习之Path总结、ServletContext、ServletResponse、ServletRequest(3)
  10. 数学图形(2.23)Cylindric sine wave柱面正弦曲线