poj 1166 The Clocks 记录路径的广搜
2015-06-05 17:26
357 查看
题意:
给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点)。
分析:
明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点。2.queue<node>比queue<int>要多花1别的时间。
给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点)。
分析:
明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点。2.queue<node>比queue<int>要多花1别的时间。
//poj 1166 //sep9 #include <iostream> #include <queue> using namespace std; char move[10][8]={"ABDE","ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"}; int vis[1000000],idx; int ans[10000]; struct NODE { int state,pre,move_used,idx; }node[600000]; queue<int> q; NODE get_node(int sta,int pre,int moves) { node[idx].state=sta; node[idx].pre=pre; node[idx].move_used=moves; node[idx].idx=idx; return node[idx++]; } int main() { int a[10],b[10],ini_state=0; idx=0; memset(vis,0,sizeof(vis)); while(!q.empty()) q.pop(); for(int i=0;i<9;++i) scanf("%d",&a[i]); for(int i=8;i>=0;--i) ini_state=ini_state*4+a[i]; NODE p=get_node(ini_state,-1,0); vis[p.state]=1; q.push(p.idx); int target_idx; while(!q.empty()){ int x=q.front();q.pop(); if(node[x].state==0){ target_idx=node[x].idx; break; } int tmp=node[x].state; for(int i=0;i<9;++i){ a[i]=tmp%4; tmp/=4; } for(int i=0;i<9;++i){ for(int j=0;j<9;++j) b[j]=a[j]; for(int j=0;move[i][j]!='\0';++j) b[move[i][j]-'A']=(a[move[i][j]-'A']+1)%4; int ns=0; for(int j=8;j>=0;--j) ns=ns*4+b[j]; if(vis[ns]==0){ NODE np=get_node(ns,node[x].idx,i+1); q.push(np.idx); vis[ns]=1; } } } int x=0; while(target_idx!=0){ ans[x++]=node[target_idx].move_used; target_idx=node[target_idx].pre; } for(int i=x-1;i>=0;--i) printf("%d ",ans[i]); return 0; }
相关文章推荐
- https://和http://区别
- 指针实现通讯录
- 复制代码去除行号
- 人生的五大投资,你投错了吗?
- SQL Server日志清除的几种方法
- IS-IS协议和RIP协议的路由重分发详细过程
- 返回在指定日期内有几个指定的星期数
- htmlcleaner xpath的一些tips
- mysql日志详细解析 [转]
- IOS地图及定位使用
- php moungoDB
- LeetCode_22---Generate Parentheses
- 自定义安卓控件错误 Custom view MySwitchBtn is not using the 2- or 3-argument View constructors; XML attribute
- 测试博文
- 测试博文测试博文测试博文测试博文测试博文
- 如何写用户导向的互联网文案?
- sqlite
- 忽略时间,以'帧'为概念的重力系统(通过updatePosition来更新位置代替MoveTo)
- Microsoft SQL Server数据库文件恢复技术
- SBJson的使用