USACO1.4.2(The clocks)BFS
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相关推荐
- USACO1.4 The Clocks(clocks)
2019独角兽企业重金招聘Python工程师标准>>> 使用暴力搜索,枚举所有移动方案,及时中止不合时方案来节省时间.到现在依旧不会使用更高级的搜索算法,下一步需要学习一下理论知识. ...
- 搜索专题-----bfs、dfs模板,栈,队列
P1443 马的遍历 题目描述 有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步. 输入格式 输入只有一行四个整数,分别为 n,m,x,y. 输 ...
- HDU-1459.非常可乐(BFS )
这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...
- 洛谷 P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib
P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给 ...
- HDU1548:A strange lift(Dijkstra或BFS)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...
- HDU 1429 胜利大逃亡(续) (BFS+位压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- usaco Overfencing 穿越栅栏(BFS)
Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...
- 数据结构--搜索BFS
文章目录 广度优先搜索 典型例题 广度优先搜索 广度优先搜索类似于树的层次遍历过程.它需要借助一个队列来实现.如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1.v2. ...
- 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝
题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...
最新文章
- 正则表达式匹配多个字符(*、+、?、{m}、{m,n})
- 根据ip获取用户地址-百度
- 算法---给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合
- linux 目录操作
- 【Infragistics教程】在javascript构造函数中创建基本继承
- 结合Composer 新版本PHP的开发方式
- linux驱动初探之字符驱动
- L2-024. 部落-PAT团体程序设计天梯赛GPLT
- XSD详解三 - 复合元素+总结篇
- 大连理工计算机基础作业2,大工18秋《计算机应用基础》在线测试2答案
- linux把mac格式化了,Mac上将树莓派已经写了系统的SD卡(磁盘)抹除、格式化
- 谈cntv.cn的启用
- Elasticsearch索引分片的数量及大小分配策略
- tukey是什么意思_turkey中文是什么意思怎么读(英语里这个TURKEY这个多义词解析)...
- Composer中的ThingWorx模型定义—建模
- 监控摄像机安装的正确位置是哪里
- 从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
- 定义一个表示学生信息的类Student,要求如下:
- 10岁男童高考566分8岁开发操作系统
- Android如何让APP进程常驻内存?
热门文章
- CUR分解算法及Python实现
- Pandas.DataFrame按行求百分数(比例数)
- 插入排序InsertionSort(Python实现)
- U盘加载速度慢的解决方法
- Spring Boot OAuth 2.0 客户端
- Gym 101128 B Black Vienna
- redis数据库入门
- SQL Server 2008 R2 开启数据库远程连接
- JavaWeb学习之Path总结、ServletContext、ServletResponse、ServletRequest(3)
- 数学图形(2.23)Cylindric sine wave柱面正弦曲线