USACO 6.5.4 The Clocks BFS

[USACO 1.4.2] The Clocks [题目描述] The Clocks 时钟 IOI'94 - Day 2 考虑将如此安排在一个 3 x3 行列中的九个时钟: 目标要找一个最小的移动顺序次将所有的指针指向12点。 下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。 选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度。 移动方法 受影响的时钟 阅读详情

http://train.usaco.org/usacoprob2?a=BI4LEPNXcEa&S=clocks

题目大意:给九个钟的初始状态,指针只可能指向3,6,9,12,有九种操作,每种操作拨动一个固定组合的种顺时针45°,求最少操作能够把所有钟拨到12的情况(操作数相同时,要操作的数字小),按顺序输出




一开始觉得每次有九种选择的可能性,又要输出操作数最少的情况,就想到了用IDDFS,但是在第七个样例超时。为了处理结果操作数比较大的情况,想到了二分,但是然并卵,因为操作数不满足二分性,小的操作数下能够完成并不代表大的操作数必定能够完成

随后迫于无奈使用了BFS,没想到竟然过了,可能因为哈希查重的关系队列并不会变得很长


记录操作我一开始用的string类,但是会超时,就改成了前驱数组。哈希是将钟的情况用一个四进制数表示,直接用数组记录

/*
ID: frontie1
TASK: clocks
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

bool visited[270000];
int pre[270000];
int log[270000];
int table[15];
int oper[10][6] = {{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}};
int oper_num[10] = {4, 3, 4, 3, 5, 3, 4, 3, 4};
queue<int> Q;

int encode()
{
    int output = 0;
    for(int i = 1; i <= 9; ++i){
        output <<= 2;
        output += table[i];
    }
    return output;
}

void decode(int num)
{
    for(int i = 9; i >= 1; --i){
        table[i] = num%4;
        num >>= 2;
    }
}


void BFS()
{
    Q.push(encode());
    pre[encode()] = -1;
    visited[encode()] = true;
    int cur, nxt;

    while(!Q.empty()){
        cur = Q.front(); Q.pop();
        decode(cur);
        for(int ope = 0; ope < 9; ++ope){
            for(int i = 0; i < oper_num[ope]; ++i){
                ++table[oper[ope][i]];
                table[oper[ope][i]] %= 4;
            }
            nxt = encode();
            if(!visited[nxt]){
                visited[nxt] = true;
                pre[nxt] = cur;
                log[nxt] = ope+1;
                if(nxt == 0) return;
                Q.push(nxt);
            }
            for(int i = 0; i < oper_num[ope]; ++i){
                table[oper[ope][i]] += 3;
                table[oper[ope][i]] %= 4;
            }
        }
    }
}

void print_num(int num)
{
    if(pre[num] == -1) return;
    print_num(pre[num]);
    cout << log[num];
    if(num != 0) cout << ' ';
}

int main()
{
    freopen("clocks.in", "r", stdin);
    freopen("clocks.out", "w", stdout);

    for(int i = 1; i <= 9; ++i){
        cin >> table[i];
        table[i] /= 3;
        table[i] %= 4;
    }

    int ori = encode();

    BFS();

    print_num(0);
    cout << endl;

    return 0;
}


附录:IDDFS的做法(会超时的)

/*
ID: frontie1
TASK: clocks
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

bool visited[40][270000];
int table[15];
int oper[10][6] = {{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}};
int oper_num[10] = {4, 3, 4, 3, 5, 3, 4, 3, 4};
int step;
int answer[100];

void printtable()
{
    for(int i = 1; i <= 9; ++i){
        cout << table[i] << ' ';
    }
    cout << endl;
}

int encode()
{
    int output = 0;
    for(int i = 1; i <= 9; ++i){
        output <<= 2;
        output += table[i];
    }
    return output;
}

bool DFS(int dep, int ope)
{
    if(dep == step){
        for(int i = 1; i <= 9; ++i){
            if(table[i] != 0) return false;
        }
        return true;
    }
    for(int i = 0; i < oper_num[ope]; ++i){
        ++table[oper[ope][i]];
        table[oper[ope][i]] %= 4;
    }
    int code = encode();
    if(!visited[step-dep-1][code]){
        answer[dep] = ope;
        visited[step-dep-1][code] = true;
        for(int i = 0; i < 9; ++i){
            if(DFS(dep+1, i)) return true;
        }
    }
    for(int i = 0; i < oper_num[ope]; ++i){
        table[oper[ope][i]] += 3;
        table[oper[ope][i]] %= 4;
    }
    return false;
}

bool DFS_trigger()
{
    for(int i = 0; i < 9; ++i){
        if(DFS(0, i)) return true;
    }
    return false;
}

bool BS(int lo, int hi)
{
    if(lo > hi) return false;
    int mid = ((lo+hi)>>1);
    if(BS(lo, mid-1)) return true;
    step = mid;
    if(DFS_trigger()) return true;
    BS(mid+1, hi);

}

int main()
{
    freopen("clocks.in", "r", stdin);
    freopen("clocks.out", "w", stdout);

    for(int i = 1; i <= 9; ++i){
        cin >> table[i];
        table[i] /= 3;
        table[i] %= 4;
    }


//    while(!DFS_trigger()){
//        ++step;
//    }

    BS(1, 30);

    for(int i = 0; i < step; ++i){
        cout << answer[i]+1;
        if(i != step-1) cout << ' ';
    }
    cout << endl;

    return 0;
}


SUMO仿真教程(5) —— 使用“XML“语言自定义构建路网 文章目录一.简要介绍1.node file2.edge file3.lane definitions(1)路段细分(2)邻近的对向车道(3)删除边或车道4.type file(1)简要概述(2)edge定义中引用type文件的示例(3)指定车辆种类的速度限制5.connections file(1)简要概述:(2)connection的属性参数(3)删除连接(4)设置连接的优先级(5)同一边的多个连接二.演示示例:1.自定义编写node file2.自定义编写edge file3.自定义编写type fil 阅读详情

相关推荐

基于STM32的Keil5代码自动补全设置操作指南

掌握Keil5代码自动补全设置技巧,提升STM32开发效率。通过合理配置编辑器选项,实现智能提示与语法补全,让嵌入式编程更流畅,尤其适合使用keil5代码自动补全设置的开发者快速上手。

weixin_32287387的博客 762

【USACO training】Chapter 1 入门

Section 1.1 介绍 USACO Training 综述 http://train.usaco.org/usacogate(USACO 97道题) USA Computing Olympiad 是美国高校的信息学测评网站,也是美国中学生的官方竞赛网站。 美国著名在线题库,专门为信息学竞赛选手准备。 全英文界面,但有非官方的中文翻译。推荐直接阅读英语原文,既准确可靠又可提高英语水平。 网站的Training题目全面,每道题附有详细题解,可查看测试数据和运行结果,便于调试、发

繁凡さん的博客 1754

Fedora 41上安装钉钉7.6.25,我踩过的那些依赖坑和最终解决方案

本文详细记录了在Fedora 41上安装钉钉7.6.25版本的全过程,包括解决依赖问题、转换deb包为rpm格式、处理libm.so.6错误等关键步骤。通过分享这些实用技巧和最终解决方案,帮助Linux用户顺利在Fedora系统上运行钉钉客户端,提升工作效率。

weixin_30485379的博客 205

USACO training chapter1 入门/section1.5

USACO training chapter1 入门/section1.5Arithmetic ProgressionsMother's Milk 简单的搜索入门,只有两题,都可以用深搜来做,第二题可广搜,但是代码很烦,用dfs简单点。 Arithmetic Progressions 先枚举公差,然后枚举起点。 貌似可以证明公差只需要+4的枚举。 注意枚举范围,否则会很慢。 #include &l...

一个菜的不行的人的博客 324

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

专治疑难系列 - 解决打印机凭证冲突问题

一、问题描述 二、解决方法 三、问题已解决

Passerby_Wang的博客 2万+

CUDA编程——图的表示及BFS算法

CUDA编程——图的表示及常用算法(BFS, SSSP, APSP) 最近根据老板要求,在学习CUDA编程,昨天看了一篇很久之前的论文,《Accelerating large graph algorithms on the GPU using CUDA,说是第一篇介绍CUDA图形算法的论文,主要包括BFS, SSSP和APSP在GPU编程中的实现过程。今天写这篇博客复盘一下 ...

NKU_Yang的博客 2342

Moltbot 超详细安装使用教程(初学者版)

你在外面逛街,用微信/Telegram 发消息说"帮我查一下明天的天气"它立刻帮你查好并回复你说"帮我在电脑上新建一个文件夹叫'工作文档'"它真的帮你在电脑上创建了这就是 Moltbot ——一个能真正帮你干活的 AI 助手。API Key 就像是一把"钥匙",让 Moltbot 能够使用 AI 服务。

weixin_51040479的博客 2014

USACO算法平台介绍

一、平台简介 usaco是美国中学生的官方竞赛网站,美国著名在线题库,专门为信息学竞赛选手准备,但必须在注册后才能进入题库1,虽然说是面对美国中学生的网站,但是里面的题目对于新手来说并不简单。 二、注册 1 首先我们进入train.usaco.org 2 在登录栏上面有“Register here for a username/password”这一行,点击进去 3 按照要求输入名字...

小树学信奥 2775

4.Simulink基础建模操作——加减乘除运算

加减乘除运算

FPGA/MATLAB学习教程/源码/项目合作开发 9549

《备考信息系统项目管理师》 - 专栏介绍和目录

本专栏会持续详细梳理软考高级信息系统项目管理师(高项)的考点、所有历年真题(包括综合知识、案例分析、论文)等,有论文专项,预测模拟题等内容。需要的可以先订阅下哦。

数据知道的博客 2万+

usaco 1.5.2 The Clocks

麻麻说,如果研究了三天还是不会做的话,就算了吧。恩。 The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | | |---O

shshwdr的专栏 1315

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1150

USACO Section 1.4 The Clocks (clocks)

bfs+剪枝。 如果某个钟表状态在之前出现过那么就不需要再加入到队列中了。由于不会哈希所以开了个9维数组判重。 之前因为路径数组和clock数组合并在一起写了,结果一直内存超限。 这个题因为clock里面有个长度是10的数组所以在用路径的时候这个数组是没用的,所以这俩东西应该分开写。 总之这个WA,TLE,RE了N次。 /* ID:kkkwjx1 LANG:C++ TASK:clocks

Fighting 828

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

USACO 1.4 The Clocks

虽然很多方法都一个意思……但是我因为算错2^27,认为爆int就没用位运算……然后傻呼呼的居然在压十进制位在做BFS…… 在USACO上TLE,但是其他OJ一般卡时内能过…… 9个数字分解为0123,然后用一个9位数保存…… 大量时间浪费在拆解数字上…… /* TASK:clocks LANG:C++ */ #include #include #include #include

ACMer不要报考高校代码为13627的移通学院! 541

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

USACO/clocks

http://www.nocow.cn/index.php/Translate:USACO/clocks BFS注意剪枝。 计算好数组类型和大小。 /* LANG: C++ PROG: clocks */ #include #include #include #include #include #include #include #include #include

Chromer_cn的专栏 949

USACO section 1.4.2 The Clocks

USACO section 1.4.2 The Clocks 1. 这道题有好多种解法,看NOCOW,用枚举,DFS,BFS都能求解。我看到这个题的时候,连最基本的枚举怎么做都想不出来,差距呐。。。; 2. 我挑选了解题报告中代码最短的读懂然后写出来了: /...

dayong9372的博客 284

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

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

NDCSID的博客 848

usaco6.5.4 The Clocks

一 原题 The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | | |---O | |---O | |

max_kibble的博客 288

洛谷 P1213 时钟 &&IOI 1994 The Clocks

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

weixin_30580341的博客 376

USACO 1.4 The Clocks (位操作+枚举+BFS)

#include #define DEBUG 1 #define TESTCASES 9 #define CLOCKS 9 #define MOVES 9 #define STATES 300000 //4^9 < 3000000 int queue[STATES]; int head, tail; //既可以记录前个状态,又可以而作状态被访问过的标记 int pre[STATES]; int

TiuTiu Zone 671

USACO The Clocks

都说是个简单题,可能是我好久没编什么,退化了,连别人写的bfs,dfs都看不懂。悲剧!这个题我一开始想到直接枚举应该不会超时,因为只是4^9的规模。但是由于剪枝不会,位运算不会等一系列不会指挥果断悲剧。翻阅了无数解题报告之后竟然没看懂别人的意思。后来知道了答案只有一个根本无需判重,才在一个前辈的代码的帮助下勉强ac,悲剧的usaco,好难呀!bt题也不少。本代码主要参考别人的。 /* ID...

weixin_30355437的博客 61

USACO-cha1-sec1.4 The Clocks

The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | | |---O | |---O | | O |

JSure的代码库 1254

【宽搜】The Clocks 时钟 (Usaco_Training 1.4)

The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | | |---O | |---O | | O |

Jiangzh_MZOI 795

USACO 1.4 clocks 分析

枚举 Breadth First Search 结构内声明函数 非递减拓展 位运算

acmerzjb 的旅途 559
上一篇: USACO 6.5.3 Betsy's Tour 搜索剪枝
下一篇: USACO 6.5.5 Checker Challenge 回溯
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值