Poj 1166 The Clocks(bfs)
题目链接:http://poj.org/problem?id=1166
思路分析:题目要求求出一个最短的操作序列来使所有的clock为0,所以使用bfs;
<1>被搜索结点的父子关系的组织:
在bfs中,队列中存储着解答树中搜索过的结点,并且每个结点都可以使用它在队列中的位置作为其唯一的ID;
另外,使用另一个数组存储结点的父节点和从父节点到该节点的操作,同样的,使用结点在队列中的位置作为该节点的ID;
这种方法类似于并查集的方法,使用多个线性数组来模拟树的结构;这里模拟解答树中搜索过的结点构成的树的结构;
<2>判重方法: 对于每个结点都有一个唯一的状态,使用位运算进行状态压缩和一个判重数组即可实现判重;
代码如下:
#include <queue>
#include <vector>
#include <iostream>
using namespace std; const int mod = ; // 以0开头的数字代表八进制
const int MAX_N = ( << ) + ;
int clock[];
bool vis[mod];
int fa[MAX_N], path[MAX_N], state_queue[MAX_N], ans[MAX_N];
char mov[][] = {"ABDE", "ABC", "BCEF", "ADG", "BDEFH", "CFI", "DEGH", "GHI", "EFHI"}; int Bfs(int s)
{
int start, head, tail; start = s;
head = tail = ;
state_queue[tail++] = start;
fa[] = -;
vis[start] = true; while (head < tail)
{
int now = state_queue[head]; for (int i = ; i < ; ++i)
{
int k = , value;
int next = now; while (mov[i][k] != NULL)
{
value = mov[i][k] - 'A';
next = next + ( << ( * value));
next = next & mod;
k++;
} if (!vis[next])
{
fa[tail] = head;
path[tail] = i + ; if (next == )
return tail;
else
{
vis[next] = true;
state_queue[tail++] = next;
}
}
}
head++;
}
return -;
} void PrintPath(int k)
{
int end = k, start = end;
int len = ; while (fa[start] != -)
{
ans[len++] = path[start];
start = fa[start];
} for (int i = len - ; i > ; --i)
printf("%d ", ans[i]);
printf("%d\n", ans[]);
} int main()
{
int start, ans, temp = ; start = ;
for (int i = ; i < ; ++i)
{
scanf("%d", &temp);
start += temp << ( * i);
} ans = Bfs(start);
PrintPath(ans);
return ;
}
Poj 1166 The Clocks(bfs)的更多相关文章
- POJ 1166 The Clocks [BFS] [位运算]
1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...
- POJ 1166 The Clocks (暴搜)
发现对这样的模拟题根本没啥思路了,本来准备用bfs的.可是结果超时了,这是參考别的人代码写的: #include <stdio.h> #include <iostream> # ...
- POJ 1166 The Clocks (爆搜 || 高斯消元)
题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...
- POJ 1166 The Clocks
高斯消元法第四个冠军,这个称号是非常令人兴奋~~ 题目大意: 给出9个钟表的状态.给出九种操作,问最少要操作几次能把全部的钟表调回12点. 解题思路: 对于9个钟表分别列方程,然后高斯消元就可以.因为 ...
- POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)
依据题意可构造出方程组.方程组的每一个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- POJ 1166:The Clocks
The Clocks Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15357 Accepted: 6230 Descr ...
- poj 3026 Borg Maze (BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS Memory Limit:65536KB 64bit IO For ...
- POJ 1979 dfs和bfs两种解法
fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...
随机推荐
- Visual Studio之Nuget(服务器)
一.创建空Web项目 二.安装Nuget.Server 这个时候,安装完成后,发现项目文件里多了Default.aspx等文件,因为我选择的MVC,所以最好做下小小的调整 ——在Global.asax ...
- Nginx +iis反向代理
一:简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所 ...
- 去掉iphone 的圆角样式
每次面对iphone这种丑丑的样式,我简直不能再愉快的写代码~~而且每次记不住那烦人的属性~~~必须记录下来~~ -webkit-appearance:none 为了下次不用再百度,终于背下来~~~
- ndk 编译 boost 库,支持serialization
Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...
- HTML5速查表
HTML5速查表 标签 描述 版本 属性 <!--...--> 定义注释 4 / 5 none <!DOCTYPE> 定义文档类型 4 / 5 none <a> 定 ...
- Mac使用技巧
外接显示器的生活,在 系统偏好设置--显示器--排列中,点击那个白色的条,可以设置主显示器.
- 转:CI伪静态化
去掉php框架CI默认url中的index.php 2010-03-17 17:33:07| 分类: php框架ci |字号 订阅 CI默认的rewrite url中是类似这样的,例如你的CI根 ...
- openstack nova修改实例路径,虚拟磁盘路径
#实例路径 --instances_path=$state_path/instances #日志的目录 --logdir=/var/log/nova #nova的目录 --state_path=/va ...
- SGU 242 Student's Morning 网络流(水
题目链接:contest=0&problem=242">点击打开链接 题意: 给定n个人,m个终点 以下n行表示每一个人能够去m个点. 每一个人仅仅能去一个点. 输出随意一个方 ...
- 转 c#代码访问https服务器以及https的webservice
最近公司做到WebService项目,但是要通过Https调用,自己在网上搜了半天,终于实现了服务端的Https,但是一直没有找到客户端如何实现,今天终于看到这篇文章,随手记录下来. 具体代码如下: ...