POJ1166Clocks(穷举+函数指针数组+位操作)

配流01—DIAL算法(经典) 《基于LOGIT的STOCH配流法——dial算法》 运行环境:MATLAB 8.3.0.532 作者信息:兰州交通大学 刘志祥 QQ:531548824 说明:本程序用于进行静态配流,缺点是有效路径的界定太过严,请读者根据需要进行修改。 阅读详情

Description

这里写图片描述

There are nine clocks in a 3*3 array (figure 1). The goal is to return all the dials to 12 o’clock with as few moves as possible. There are nine different allowed ways to turn the dials on the clocks. Each such way is called a move. Select for each move a number 1 to 9. That number will turn the dials 90’ (degrees) clockwise on those clocks which are affected according to figure 2 below.
Move Affected clocks

1 ABDE

2 ABC

3 BCEF

4 ADG

5 BDEFH

6 CFI

7 DEGH

8 GHI

9 EFHI

(Figure 2)

Input

Your program is to read from standard input. Nine numbers give the start positions of the dials. 0=12 o’clock, 1=3 o’clock, 2=6 o’clock, 3=9 o’clock.

Output

Your program is to write to standard output. Output a shortest sorted sequence of moves (numbers), which returns all the dials to 12 o’clock. You are convinced that the answer is unique.

Sample Input

3 3 0
2 2 2
2 1 2

Sample Output

4 5 8 9

算法

穷举,穷举对象和前几篇文章POJ1222,1753不同,穷举不同的操作的操作次数(每个操作最多3次,否则与之前相同),这一方面是因为题目缺少一个可以确定全部操作的局部(POJ1222里的第一行或第一列),另一方面对一个数据可进行的操作的种数过多,难以穷举对单个数据的操作。
POJ1222题解,(看一个就够,1753换汤不换药)
然后就是比较,更新最小值,输出等等。

Trick

对不同的操作的操作数进行穷举,很多网上的题解采用了九重循环的方式,不太雅观,可以使用位操作替代,也就是一个数中的特定位置的几个bit位代表某个操作的操作次数,本题中操作数量最多为3,可用两个bit位表示,比如代码中的k最后两个bit表示OpeA的操作数量,倒数3-4的表示OpeB的操作数量,以此类推,同时九个操作函数可以使用函数指针数组的方式存储,方便快捷!

AC Code

#include<stdio.h>

#define NUMOPE 9

int GetBit(int Target, int i);
//The times of one operation from bits
void OpeA(int Present[3][3]);
void OpeB(int Present[3][3]);
void OpeC(int Present[3][3]);
void OpeD(int Present[3][3]);
void OpeE(int Present[3][3]);
void OpeF(int Present[3][3]);
void OpeG(int Present[3][3]);
void OpeH(int Present[3][3]);
void OpeI(int Present[3][3]);
//All the operations
int Test(int Present[3][3]);
int Compute(int k);
//How many operations are there?
void DisplayOpe(int k);
void GetOrigin(int Origin[][3]);

int main()
{
    void (*Operate[NUMOPE + 2])(int Present[3][3]) = {
            OpeA, OpeB, OpeC, OpeD, OpeE, OpeF, OpeG, OpeH, OpeI
    };                                  //function pointer array
    int Origin[3][3], Present[3][3], min = 50, minOpe = 0;
    int OpeNum[9];

    GetOrigin(Origin);
    for (int k = 0; k < 262144; k++) {                  //all the combinations of operation in bits
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                Present[i][j] = Origin[i][j];
            }
        }

        for (int i = 0; i < 9; i++) {
            int num = GetBit(k,i);
            if (num) {
                for (int ii = 0; ii < num; ii++) {
                    Operate[i](Present);
                }
            }
        }

        if (Test(Present)) {
            int Total = Compute(k);
            if (Total < min) {
                min = Total;
                minOpe = k;
            }
        }
    }

    //printf("%d\n", min);
    DisplayOpe(minOpe);

    return 0;
}

void GetOrigin(int Origin[][3])
{
    for (int  i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            scanf("%d", &Origin[i][j]);
        }
    }
}

int GetBit(int Target, int i)
{
     return ((Target >> (2 * i)) & 1) + ((Target >> (2 * i + 1)) & 1) * 2;
}

void OpeA(int Present[3][3])
{
    Present[0][0] = (Present[0][0] + 1) % 4;
    Present[0][1] = (Present[0][1] + 1) % 4;
    Present[1][0] = (Present[1][0] + 1) % 4;
    Present[1][1] = (Present[1][1] + 1) % 4;
}

void OpeB(int Present[3][3])
{
    Present[0][0] = (Present[0][0] + 1) % 4;
    Present[0][1] = (Present[0][1] + 1) % 4;
    Present[0][2] = (Present[0][2] + 1) % 4;
}

void OpeC(int Present[3][3])
{
    Present[0][1] = (Present[0][1] + 1) % 4;
    Present[0][2] = (Present[0][2] + 1) % 4;
    Present[1][1] = (Present[1][1] + 1) % 4;
    Present[1][2] = (Present[1][2] + 1) % 4;
}

void OpeD(int Present[3][3])
{
    Present[0][0] = (Present[0][0] + 1) % 4;
    Present[1][0] = (Present[1][0] + 1) % 4;
    Present[2][0] = (Present[2][0] + 1) % 4;
}

void OpeE(int Present[3][3])
{
    Present[1][0] = (Present[1][0] + 1) % 4;
    Present[1][1] = (Present[1][1] + 1) % 4;
    Present[1][2] = (Present[1][2] + 1) % 4;
    Present[2][1] = (Present[2][1] + 1) % 4;
    Present[0][1] = (Present[0][1] + 1) % 4;
}

void OpeF(int Present[3][3])
{
    Present[0][2] = (Present[0][2] + 1) % 4;
    Present[1][2] = (Present[1][2] + 1) % 4;
    Present[2][2] = (Present[2][2] + 1) % 4;
}

void OpeG(int Present[3][3])
{
    Present[1][0] = (Present[1][0] + 1) % 4;
    Present[1][1] = (Present[1][1] + 1) % 4;
    Present[2][0] = (Present[2][0] + 1) % 4;
    Present[2][1] = (Present[2][1] + 1) % 4;
}

void OpeH(int Present[3][3])
{
    Present[2][0] = (Present[2][0] + 1) % 4;
    Present[2][1] = (Present[2][1] + 1) % 4;
    Present[2][2] = (Present[2][2] + 1) % 4;
}

void OpeI(int Present[3][3])
{
    Present[1][1] = (Present[1][1] + 1) % 4;
    Present[1][2] = (Present[1][2] + 1) % 4;
    Present[2][1] = (Present[2][1] + 1) % 4;
    Present[2][2] = (Present[2][2] + 1) % 4;
}

int Test(int Present[3][3])
{
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (Present[i][j] != 0) {
                return 0;
            }
        }
    }

    return 1;
}

int Compute(int k) {
    int Total = 0;
    for (int i = 0; i < 9; i++) {
        Total += GetBit(k, i);
    }
    return Total;
}

void DisplayOpe(int k)
{
    int Bool = 1;
    for (int i = 0; i < 9; i++) {
        int num = GetBit(k,i);
        if (num) {
            if (Bool) {
                Bool = 0;
                printf("%d", i + 1);
                for (int ii = 0; ii < num - 1; ii++) {
                    printf(" %d", i + 1);
                }
            }
            else {
                for (int ii = 0; ii < num; ii++) {
                    printf(" %d", i + 1);
                }
            }
        }
    }
    printf("\n");
}

dials_shortest_path:Dial最短路径算法的实现 dials_shortest_path Dial最短路径算法的实现 可以在我的上找到该算法的描述 cn 运行程序 python spsolve.py --infile input_file --output outfile or python spsolve.py To use stdin and stdout 输入格式 输入采用 DIMACS 格式,可以使用生成。 DIMACS 格式是面向行的。 一行包含的记录类型由位置 1 中的字符指示。 c 表示注释行。 有一个类型为 p 的记录。 该记录说明问题类型(对于最短路径问题,此字段始终为 min)、节点数 n 和弧数 m。 每个具有非零供应或需求的节点都有一个类型为 n 的记录。 对于最短路径问题,源节点应该有 n - 1 的供给,每个非源节点应该有供给 -1。 netgen 问题生成器生成的节点的索引从 1 到 n,但求解 立即下载

相关推荐

手把手教你安装 Vivado2022.2(附安装包)

Vivado 2022.2版本与之前的版本相比,具有以下几个显著的优势:电源设计管理器(PDM):Vivado 2022.2引入了全新的电源设计管理器(PDM),这是一个下一代功耗评估平台,为Versal® 和 Kria™ SOM提供了准确一致的功耗估计能力。PDM是Versal产品家族的首选功耗评估工具,为Versal ACAP硬IP块提供增强向导,简化从XPE向PDM的迁移,帮助用户获得准确的功耗评估。

dpwkj的博客 2万+

算法基础 枚举之拨钟问题poj1166以及简单递归

描述 有9个时钟,排成一个3*3的矩阵。 |-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |-------| A B C |-------| |-...

zjsru_Beginner的博客 653

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8691

POJ 1166解题报告

这道题首先是从USACO上看到的,然后用特别标准的BFS(队列+set)从初始状态到目标状态(全是0)转换。刚开始用一个int表示一个状态,用一个10^9的bool数组记录是否被访问过,结果超出了空间。改成map记录后时间超了。权衡之下多加了个hash,因为每位只能取0~3(分别代表12,3,6,9),所以只需要4^9空间。这样就通过了usaco的测试。 代码如下: #include #in

thestoryofsnow的专栏 2873

ANSYS接触分析实战:从法兰连接案例看接触刚度与穿透容差的黄金搭配

本文以法兰连接为实战案例,深入解析了ANSYS接触分析中接触刚度(FKN)与穿透容差(FTOLN)的参数设置策略。通过系统性敏感性分析,揭示了这对关键参数的博弈关系与调优逻辑,旨在帮助工程师在保证计算收敛的同时,获得高精度的有限元分析结果,有效解决工程中的非线性接触难题。

moon9的博客 312

LiteratureReading:[2022] Reformer: The Efficient Transformer

所属机构:加州大学伯克利分校(U.C. Berkeley)和谷歌研究(Google Research)。电子邮件:kitaev@cs.berkeley.edu所属机构:谷歌研究(Google Research)。电子邮件:lukaszkaiser@google.com所属机构:谷歌研究(Google Research)。电子邮件:levskaya@google.com大型Transformer模型在许多任务上通常能够达到最先进的结果,但训练这些模型可能非常昂贵,尤其是在处理长序列时。

有朋自远方来,不亦乐乎。 1211

poj_1166_枚举(或者递归/回溯)

题目描述:     给出九个闹钟。闹钟指向0-3-6-9四个点钟方向。有九个设定好的动作,分别指定对某几个闹钟正向拨动3点钟方向。输入给出九个闹钟初始指向,求用设定好的动作,最少用几组就能够把所有闹钟都拨到0点钟方向。   解题思路:    一开始想用回溯做。结果卡在用一个循环+回溯会导致重复计算之前做过的动作上。用枚举做,算了算只要最终结果move个数超过5,效率就比回溯高好多了。所以就用枚举,

河洛 539

RT-Thread NANO V4.1.1 在Cortex-M0上移植踩坑记:解决内存分配宏导致的线程创建失败

本文详细记录了RT-Thread NANO V4.1.1在Cortex-M0平台移植过程中遇到的内存分配宏配置问题,导致线程创建失败的解决方案。通过分析内存管理算法宏定义,将RT_USING_SMALL_MEM替换为RT_USING_SMALL_MEM_AS_HEAP,成功解决了线程创建问题,为开发者提供了实用的移植经验。

weixin_29189373的博客 306

POJ 1166 The Clocks(拨钟问题)

描述有9个时钟,排成一个3*3的矩阵。 现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。 移动 影响的时钟 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDE

不若乘风来 1379

深入Linux内核:PTP硬件时间戳(HW Timestamp)是如何炼成的?

本文深入探讨了Linux内核中PTP硬件时间戳(HW Timestamp)的实现原理与实战应用。通过分析IEEE 1588协议在网络时间同步中的关键作用,详细解析了硬件时间戳在Linux内核中的架构设计、驱动开发及性能优化技巧,帮助开发者实现纳秒级精度的时间同步。

weixin_30727835的博客 650

从安装到出图:一份给振动测试新手的LMS Test.Lab 2021完整避坑手册(含许可证更新和常见弹窗解决)

本文为振动测试新手提供LMS Test.Lab 2021的完整使用指南,涵盖安装配置、许可证更新、数据采集到频域后处理的全流程。特别针对常见弹窗错误提供解决方案,并详细讲解Colormap时频图分析技巧,帮助用户快速掌握振动数据分析核心技能。

weixin_29268331的博客 981

poj(1166)——拨钟问题

题意: 又是一道枚举题。。 9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。 输出 输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。 操作: 移动 影响的时钟 1 ABDE 2 ABC

ACM_hades的梦想之路 2380

具身智能与空天具身智能:从理论到实践的AIBOX技术革命

本文深入探讨了具身智能从理论到实践的发展,重点介绍了AIBOX技术如何作为边缘智能计算模块,为无人机、机器人等无人系统提供可进化的“大脑”。文章通过空天具身智能等应用场景,阐述了AIBOX在实现感知、决策、行动一体化闭环中的核心作用,并展望了其在协同智能与规模化部署中的未来挑战与机遇。

lll78的博客 765

poj 1166 The Clocks

Description |-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |-------|

小张的专栏 775

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《搜索》— POJ 1166 The Clocks(搜索枚举)

The Clocks Time Limit:1000MS Memory Limit:65536K Total Submissions:17299 Accepted:7126 Description |-------| |-------| |-------| | | | | | | | ...

69小石头的博客 652

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ 1166:The Clocks

总时间限制: 1000ms内存限制: 65536kB描述|-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |-...

Xiao_Chen_L的博客 327

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

POJ 1166 The Clocks

The ClocksTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 9161 Accepted: 3564<br />Description|-------| |-------| |-------| <br />| | | | | | | <br />|---O | |---O | | O | <br />| | | |

SsZyL 510

POJ 1166 The Clocks(拨钟问题——枚举)

#define LOCAL #include&lt;cstdio&gt; #include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std; int clk[10];int num[10]; int main() { #ifdef LOCAL freopen("/Users/wangkeyuan/i.txt","r",s...

Ericipher的博客 376

JSON-RPC 2.0为何成为AI Agent Harness通信首选?协议原理与实战解析

在现代AI应用开发中,智能体(Agent)与工具集成的复杂度日益攀升,其背后离不开一套轻量高效的远程过程调用(RPC)协议支撑。JSON-RPC 2.0,这个诞生于XML-RPC与SOAP争霸时代的“老协议”,正因AI Agent生态的爆发而重回技术舞台中心。它采用纯文本、无状态、请求响应与id显式关联的消息模型,天然适配工具调用、技能注册、插件管理等动态交互场景。无论是LangChain等框架中的function calling、MCP规范的会话流程,还是Agent Harness的运行时通信,都将JSO

weixin_34014555的博客 490

POJ 1166(Gauss消元 取模)

Problem |——-| |——-| |——-| | | | | | | | |—O | |—O | | O | | | | | | | |——-| |——-| |——-| ​ A B C ...

Feynman1999的博客 655

USACO: clocks

这道题来自于IOI 94。 Consider nine clocks arranged in a 3x3 array thusly:|-------| |-------| |-------| | | | | | | | |---O | |---O | | O | |

archerzz的专栏 1042

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

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

diying4157的博客 356

北京2008的挂钟

题目描述   在2008北京奥运会雄伟的主会场的墙上,挂着如上图所示的3*3的九个挂钟(一开始指针即时针指向的位置请根据输入数据调整)。然而此次奥运会给与了大家一个机会,去用最少的移动操作改变上面的挂钟的时间全部为12点正(我们只考虑时针)。然而每一次操作并不是任意的,我们必须按照下面给出的列表对于挂钟进行改变。每一次操作我们给而且必须给指定的操作挂钟进行,每一个挂钟顺时针转动90度。列表如下:...

qq_35091353的博客 893

poj1166 敌兵布阵(树状数组)

Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的...

一身清贫怎敢入繁华 696

The Clocks

Description |-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |-------|

知足者的专栏 1007
上一篇: POJ1753FlipGame(穷举)
下一篇: C++ Primer Section 1-2
FitzLeopard
博客等级 码龄9年 6粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值