时钟【BFS】

【BFS 换根法】P6150 [USACO20FEB] Clock Tree S|普及+ 题目描述 Farmer John 的新牛棚的设计十分奇怪:它由编号为 $1\ldots N$ 的 $N$ 间房间($2\leq N\leq 2\,500$),以及 $N−1$ 条走廊组成。每条走廊连接两间房间,使得每间房间都可以沿着一些走廊到达任意其他房间。 牛棚里的每间房间都装有一个在表盘上印有标准的整数 $1\ldots 12$ 的圆形时钟。然而,这些时钟只有一根指针,并且总是直接指向表盘上的某个数字(它从不指向两个数字之间)。 奶牛 Bessie 想要同步牛棚中的所有时钟,使它们都指向整数 $1 阅读详情

题目大意:

给出3××3一共9个钟,有以下9种变换方式:

  1. 12451245
  2. 123123
  3. 23562356
  4. 147147
  5. 2456824568
  6. 369369
  7. 45784578
  8. 789789
  9. 56895689

每种变换方式可以把序号在这个方式中的时钟增加3小时(转90度)。
求在满足变换次数最少的情况下字典序最小的方案。


思路:

很明显的广搜。由于只有3,6,9,12这4个数字(不然怎么转回去?),那么先离散化,就变成了1,2,3,4四个数字,要把这4个数字都变为4。
将每种变换方式的表打出来,再广搜+判重(9维数组水过),输出路径即可。


代码:

#include <cstdio>
#include <iostream>
#include <map>
using namespace std;

const int d[][10]={{},{1,2,4,5},{1,2,3},{2,3,5,6},{1,4,7},{2,4,5,6,8},{3,6,9},{4,5,7,8},{7,8,9},{5,6,8,9}};  //变换情况
const int num[]={0,4,3,4,3,5,3,4,3,4};  //每种情况变换时钟的个数

int head,tail,state[300001][10],father[300001],z[300001];
bool p[5][5][5][5][5][5][5][5][5];  //判重专用

bool inmap(int y)  //判重
{
    if (p[state[y][1]][state[y][2]][state[y][3]][state[y][4]][state[y][5]][state[y][6]][state[y][7]][state[y][8]][state[y][9]])
     return true;
    p[state[y][1]][state[y][2]][state[y][3]][state[y][4]][state[y][5]][state[y][6]][state[y][7]][state[y][8]][state[y][9]]=1;
    return false;
}

void find(int x)  //递归输出路径
{
    if (father[x]!=0) find(father[x]);
    printf("%d ",z[x]);
    return;
}

bool check(int x)  //判断是否达成目标
{
    for (int i=1;i<=9;i++)
     if (state[x][i]!=4) return false;
    return true;
}

void bfs()
{
    do
    {
        head++;
        for (int i=1;i<=9;i++)
        {
            tail++;
            for (int j=1;j<=9;j++)
             state[tail][j]=state[head][j];  
            for (int j=0;j<num[i];j++)
             state[tail][d[i][j]]=state[head][d[i][j]]%4+1;  //变换
            if (inmap(tail))   //已经出现过
            {
                tail--;
                continue;
            }
            z[tail]=i;  //记录变换方式
            father[tail]=head;
            if (check(tail))  //达成目标
            {
                find(tail);
                return;
            }
        }
    }
    while (head<tail);
}

int main()
{
    head=-1;
    tail=0;
    for (int i=1;i<=3;i++)
     for (int j=1;j<=3;j++)
     {
        scanf("%d",&state[0][i*3-3+j]);
        state[0][i*3-3+j]/=3;  //离散
     }
    inmap(0);  
    bfs();
    return 0;
}
Python实战:用NumPy实现LU分解与QR分解(附代码对比) 本文深入探讨了使用NumPy实现LU分解与QR分解的实战方法,通过代码对比分析了两种矩阵分解技术的原理、数值稳定性差异及核心应用场景。LU分解适用于高效求解线性方程组,而QR分解凭借其正交化特性,在求解最小二乘问题和处理病态矩阵时更具优势。文章提供了详细的Python代码示例,帮助开发者根据具体问题选择最合适的分解方法。 阅读详情

相关推荐

baostock实战:如何用Python批量下载多只股票的历史数据(含常见错误排查)

本文详细介绍了如何使用Python和baostock库批量下载多只股票的历史数据。内容涵盖从环境搭建、代码标准化到构建稳健的批量下载框架的全过程,并重点提供了高级错误处理、网络重试、数据验证及内存管理等实战解决方案,帮助用户高效构建股票数据处理流水线。

nice1的博客 1081

算法 - DFS/BFS

DFS和BFS本质上是决策树的遍历

我的精神家园 617

双轮差动机器人SLAM实战:轮速里程计从建模到精度验证(附Matlab代码)

本文详细介绍了双轮差动机器人SLAM系统中轮速里程计的实现全流程,包括核心原理、建模方法、Matlab代码实现及精度验证。通过轮速仪数据建模和连续积分算法,提升定位精度,并附有完整的误差分析和工程优化技巧,为开发者提供实用参考。

weixin_29050271的博客 224

【USACO】时钟(BFS)

题目描述考虑将如此安排在一个 3 x3 行列中的九个时钟:|-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |...

baodream的博客 869

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 414

洛谷 P1213 时钟 &&IOI 1994 The Clocks

IOI 1994 The Clocks 题目描述 考虑将如此安排在一个 3 x 3 行列中的九个时钟: 目标要找一个最小的移动顺序将所有的指针指向12点。下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时...

weixin_30580341的博客 376

手把手教你学SIMULINK模块库文件专栏-From Workspace 模块详解

模块是 Simulink 中的一个信号源模块,用于从 MATLAB 工作区加载数据作为输入信号。该模块允许用户将预先在 MATLAB 中生成的数据(如时间序列、矩阵或结构体)导入到 Simulink 模型中,从而实现更灵活的信号输入和仿真控制。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常灵活的工具,适用于需要从 MATLAB 工作区加载数据的各种场景。

MHD0815的博客 631

USACO 1.4.2 BFS 解法。

usaco 1.4.2 BFS/**//* ID: hongxdo1 PROG: clocks LANG: C++*/#include #include #include using namespace std;int const with[10][5] = {{}, {1,2,4,5},{1,2,3},{2,3,5

hongxdong的专栏 1206

MobileFusion:基于结构重参数化的移动端红外可见光图像融合方法

MobileFusion提出了一种轻量化的红外与可见光图像融合框架,通过结构重参数化技术实现移动端实时部署。该方法包含可重参数多分支卷积(RepMBConv)、轻量化上下文感知注意力(LCAA)和重参数前馈网络(RepFFN)三大模块,在训练时保留多分支结构增强特征学习,推理时合并为单路算子提升效率。实验表明,MobileFusion在MSRS、FMB等数据集上实现了融合质量与推理速度的平衡,参数量仅4000,在边缘设备上也能高效运行,为资源受限场景提供了实用解决方案。代码已开源。

毕竟是Shy哥 137

极智芯 | 解读国产CPU之海光

大家好,我是极智视界,本文分享一下 解读国产CPU之海光。希望我的分享能对你的学习有一点帮助。

极智视界 3318

【软考中级】多媒体应用设计师复习笔记第十章【free】

第10章法律法规与标准规范 行业标准 缩写的大写拼音 地方标准 DB加生代码 企业标准Q加斜线企业代号国际标准是国际标准化组织ISO和国际电工委员会IEC制定的标准 国家标准是由国务院标准化行政主管部门制定,全国范围内使用 ?强制性国家标准的代号为GB,推荐性国家标准的代号为GB/T。 ?软件开发规范GB8566-88属于强制性国家标准 在这里插入图片描述 行业标准代号由大写汉语拼音字母组成,加上斜线和T,组成推荐性行业标准,如XX/T。已经发布的行业代号有QJ(航天),SJ(电子

weixin_47120900的博客 641

[USACO1.4] [IOI1994]时钟 The Clocks

每个函数都保持在20行以内,出锅的概率大大降低,编译样例无debug一遍过,这里不是说代码能力有多好,而是说,使用这个写法,会让自己思路更加清晰,一段时间内只关注一段逻辑,很多人代码debug不出来不是因为代码能力弱,反而是因为代码能力太强,像一个。这样的代码在自己脑子十分清晰的时候是可以码的飞起的,不过可能只有两天内的自己才能看懂,可能过了两天自己回头看的时候惊呼“我靠,什么shit”。bfs肯定是那个bfs,关键是状态的表示,可以用一个int来表示状态,这样转移的时候比较麻烦,也可以用。

NDCSID的博客 848

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Poj 1166 The Clocks(bfs)

题目链接:http://poj.org/problem?id=1166 思路分析:题目要求求出一个最短的操作序列来使所有的clock为0,所以使用bfs; <1>被搜索结点的父子关系的组织: 在bfs中,队列中存储着解答树中搜索过的结点,并且每个结点都可以使用它在队列中的位置作为其唯一的ID; 另外,使用另一个数组存储结点的父节点和从父节点到该节点的操作,同样的,使用...

aqjh9999的博客 137

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[USACO] The Clocks [位操作 BFS]

思路: 位操作+广搜。 1到9个时钟,每个时钟状态用两位表示 ,共18位。即每个状态用一个int表示即可。 然后直接广搜,每个状态都是一个int型,每次某状态到达用一个hash表记录。 一次AC。 位操作写得很蛋疼,事后查了一下网上报告,好像没这么做的,就记录一下把。 /* ID:wuyanyi1 PROG:clocks LANG:C++ */ #include #inclu

Aszxqw 1129

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

洛谷 P1213 时钟 &&IOI 1994 The Clocks

IOI 1994 The Clocks 题目描述 考虑将如此安排在一个 3 x 3 行列中的九个时钟: 目标要找一个最小的移动顺序将所有的指针指向12点。下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度。 移动方法 受影响的时钟 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDE

Follow My Heart 878

USACO Section 1.4 clocks - 好恶心的搜索题

或许是我的处理问题...这题代码给敲了这么多...就是一个裸的BFS+Hash判重...判重就是把矩阵看成一个9位的四进制数...     开始我还想写A*...自以为是的用每个点的值到12的差之和来构造g(x)....结果就是搜不对..后来仔细一想...这题的g函数反正我是一下想不出....直接用BFS给水了..速度不太给力的说...应该能用A*的感觉~~ Program: /* ID

zzyzzy12 981

【USACO】clocks 遇到各种问题 最后还是参考别人的思路

//放在USACO上一直通不过 不知道哪里出了问题 输出的n总是等于1 但是BFS递归的次数是对的 《----这个问题解决了 局部变量压入queue中返回就是对的了 #include&lt;iostream&gt; #include &lt;fstream&gt; #include&lt;cstring&gt; #include&lt;queue&gt; using name...

weixin_33775572的博客 104

USACO SEC.1.4 No.2 The Clocks ★经典题目

题意:详细见USACO描述 解法: 作为IOI真题,这道题目确实是非常经典,有许多方法可以求解。 基本算法:最容易想到的就是 枚举所有情况(4^9复杂度)在时间复杂度上是可以接受的 DFS与上面的方法类似 BFS,与DFS不同之处在于,由于题目要求找到最短且字典序最小的解,所以BFS一旦搜到答案可以立即返回 BFS需要解决的问题: 1.如何表征当前状态,常规的作法仍然是数组。...

weixin_30902675的博客 137

POJ 1166 The Clocks [BFS] [位运算]

1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态;对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的状态所需要的最小操作数的操作方案; 2.输入输出:输入给出阵列初始状态,0,1,2,3分别表示0,3,6,9;要求输出最快方案的操作序列; 3.分析:IOI 1994的考题,BFS是比较容易想到的...

weixin_30337251的博客 123

POJ 1166 The clocks

  The ClocksTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8928 Accepted: 3479Description|-------| |-------| |-------|| | |

bobten2008的专栏 1285

AtCoder Beginner Contest 168 (A~E,E题很有意思)

比赛链接:Here AB水题, C - : (Colon) 时针转过得角度为:\(2π \times \frac{h + \frac m{12}}{12}\) 分针转过得角度为:\(2π \times \frac{m}{60}\) const double pi = acos(-1.0); int main() { double a, b, h, m; cin >> ...

橘嘉禾 127
上一篇: 蜥蜴【网络流】
下一篇: 【模板】最小费用最大流【费用流】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值