hdu 1667 The Rotation Game(IDA*)

RocketMq面板访问异常 com.alibaba.fastjson.JSONException: not close json text, token : string rocketmq JSONException: not close json text, token : string 问题解决 阅读详情

题目大意:

        有一个井字形结构的图形,每条线上7个数字(1,2,3,),每次可以从八个方向将一条线上的数字循环移动1个距离,问经过最少几次什么操作,可以将图形中间的八个方块变成同一种数字。

解题思路:

        使用IDA*进行搜索,估价函数为中间八个方块中,不是最多的数字的个数和。

注意点:

        题目的输入和存储都不直观,需要十分细心。

代码:

#include <iostream>

using namespace std;

int line1[7],line2[7],row1[7],row2[7];
int step,ans[10000];
bool flag;

//输入
bool input(){
    int i;
    cin >> row1[0];
    if(row1[0] == 0) return false;
    cin >> row2[0];
    cin >> row1[1] >> row2[1];
    for(i = 0; i < 7; i++){
       cin >> line1[i];
    }
    row1[2] = line1[2];
    row2[2] = line1[4];
    cin >> row1[3] >> row2[3];
    for(i = 0; i < 7; i++){
       cin >> line2[i];
    }
    row1[4] = line2[2];
    row2[4] = line2[4];
    cin >> row1[5] >> row2[5];
    cin >> row1[6] >> row2[6];
    return true;
}

//循环移动
void circle(int a[7],int direction){
    int i,temp;
    if(direction == -1){
        temp = a[0];
        for(i = 1; i < 7; i ++) a[i-1] = a[i];
        a[6] = temp;
    }
    else{
        temp = a[6];
        for(i = 6; i > 0; i --) a[i] = a[i-1];
        a[0] = temp;
    }
    return;
}

//移动
void moveDirec(int direction){
    if(direction == 0){//A操作
        circle(row1,-1);
        line1[2] = row1[2];
        line2[2] = row1[4];
        return;
    }
    if(direction == 1){//B操作
        circle(row2,-1);
        line1[4] = row2[2];
        line2[4] = row2[4];
        return;
    }
    if(direction == 2){//C操作
        circle(line1,1);
        row1[2] = line1[2];
        row2[2] = line1[4];
        return;
    }
    if(direction == 3){//D操作
        circle(line2,1);
        row1[4] = line2[2];
        row2[4] = line2[4];
        return;
    }
    if(direction == 4){//E操作
        circle(row2,1);
        line1[4] = row2[2];
        line2[4] = row2[4];
        return;
    }
    if(direction == 5){//F操作
        circle(row1,1);
        line1[2] = row1[2];
        line2[2] = row1[4];
        return;
    }
    if(direction == 6){//G操作
        circle(line2,-1);
        row1[4] = line2[2];
        row2[4] = line2[4];
        return;
    }
    if(direction == 7){//H操作
        circle(line1,-1);
        row1[2] = line1[2];
        row2[2] = line1[4];
        return;
    }
}

//反移动
void moveBack(int direction){
     if(direction == 0) moveDirec(5);
     if(direction == 1) moveDirec(4);
     if(direction == 2) moveDirec(7);
     if(direction == 3) moveDirec(6);
     if(direction == 4) moveDirec(1);
     if(direction == 5) moveDirec(0);
     if(direction == 6) moveDirec(3);
     if(direction == 7) moveDirec(2);
}
//计算中间数字的种类等
int countKind(int &maxBlock,int &blockNum){
     int i,num[4] = {0},k = 1,kind = 0;
     for(i = 2; i <= 4; i++){
        num[line1[i]] ++;
     }
     num[row1[3]] ++;
     num[row2[3]] ++;
     for(i = 2; i <= 4; i++){
        num[line2[i]] ++;
     }
     if(num[1] != 0) kind ++;
     if(num[2] != 0) kind ++;
     if(num[3] != 0) kind ++;
     if(num[k] < num[2]) k = 2;
     if(num[k] < num[3]) k = 3;
     maxBlock = k;
     blockNum = num[k];
     return kind;
}

int block;

void dfs(int floor){
    int i,kind,maxBlock,blockNum;
    kind = countKind(maxBlock,blockNum);
    if(kind == 1){
       block = maxBlock;
       flag = true;
       return;
    }
    if(floor >= step) return;
    if(floor + (8 - blockNum) > step) return;
     for(i = 0; i < 8; i++){
        moveDirec(i);
        ans[floor] = i;
        dfs(floor + 1);
        moveBack(i);
        if(flag == true) return;
     }
     return;
}

int main()
{
    int maxBlock,blockNum;
    while(input()){
        if(countKind(maxBlock,blockNum) == 1){
            cout << "No moves needed" << endl;
            cout << maxBlock << endl;
            continue;
        }

        step = 0;
        flag = false;
        while(flag == false){
            step ++;
            dfs(0);
        }
        char ch;
        for(int i = 0; i < step; i++){
            ch = 'A' + ans[i];
            cout << ch;
        }
        cout << endl;
        cout << block << endl;
    }
    return 0;
}


ET2012新版免狗免安装绿色软件 ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉, 立即下载

相关推荐

Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考

Homura_的博客 1378

hdu1667 The Rotation Game

题目描述:你有一个#。有8个不同方向可以动,编号依次为A-H。求使其中心8个块数字变成相同时,最短字典序最小的字符串以及中心的数字。 题解: 对于这种状态极为发散的搜索,我们可使用A*。而这道题要求最短,我们可以采用IDA*。 估价函数h=8-(中心块上出现最多的数的出现次数)。 因为每动一次只踢出去一个格,拉进来一个格。 代码: #include<cstdio&g...

a6t2007的博客 186

避坑指南:CentOS7.9安装Python3.8.16后yum报错的快速修复方法

本文详细解析了在CentOS7.9系统安装Python3.8.16后导致yum报错的原因,并提供了快速修复方法。通过修改yum配置文件指向Python2解释器,以及使用alternatives工具管理多版本Python,有效解决兼容性问题。同时推荐使用虚拟环境隔离开发环境,避免影响系统稳定性。

weixin_26908317的博客 494

IDA*学习笔记-HDU1667 The Rotation Game

以HDU1667为例,记录了IDA*的学习心得,终点提到A*构造的思路和原则

ex_voda的博客 291

【理解机器学习算法】之岭回归Ridge - L2 Rgularization

本人就职海外从事人工智能领域开发设计。 希望花时间总结下流行的机器学习算法,希望大家一起学习,欢迎指正!

Hyman Qiu 2316

VMware 17+Win10 22H2全栈配置指南|UEFI优化+GPU直通实战

​VMware下载:下载官网版本的Wmare 17 Pro (点击直达链接 )企业用户可选永久许可证,个人学习也可以直接安装使用,Win10镜像:微软官网下载22H2版ISO文件(附官方纯净版渠道 )

waicsdn_haha的博客 4019

hdu 1667(IDA*)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3)表示中间的八个位置中出现最多的数的个数。 因为每次操作只能改变中间8个中的一个,所以可以这样构造启发式函数。 1 #include&lt;iostream&gt; 2 #inc...

weixin_34113237的博客 198

4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南

首先第19行CREATEDATA创建er_entityset实例,指定其类型为zcl_zbook_manage_mpc=>tt_book,接着把这个引用映射到刚刚第五行定义的FIELD-SYMBOLS变量上去,这样的话,接下来我们对FIELD-SYMBOLS进行的操作,就会自动反应回引用变量er_entityset.因为我们可能在这个方法里,返回多条图书信息,所以需要用内表类型,而非单条记录的ts_book.ts_book代表一本图书的数据结构。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2961

高精度计算2的n次幂

#include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cstdio&gt; #include&lt;string&gt; #include&lt;vector&gt; #include&lt;cstdlib&gt; #include&lt;algorithm&gt; using namespace std; char a[1005

hxs的博客 2970

【论文复现】——基于欧式聚类的车载点云道路提取

针对车载激光点云道路信息提取的问题,提出了一种基于欧式聚类的道路提取方法。首先通过统计滤波去除噪点以免对后续处理结果产生影响,然后用坡度滤波去除路坎点,使道路边界与人行道、绿化带等与路坎相连的地物形成10~25 cm的高程阶跃,最后用欧式聚类将路面点云与其他地物点云聚类为一簇或多簇并保留道路簇,从而实现道路点云的精确提取。

点云侠的博客 1135

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1449

HDU-1667 The Rotation Game(IDA*)

题意 https://www.luogu.org/problemnew/show/UVA1343 思路 首先枚举终态是 1,2,31,2,31,2,3 中的哪一个,然后再把 242424 个数字压成一个长度为 242424 的 010101 串(111 表示终态的数字),直接用 int\text{int}int 来表示这个数。 可以先打表出每一个操作,转动了哪些位置,然后就可以很快的挪动这个010...

Paulliant的博客 457

【光子 AI】AI Agent 知识体系深度研究报告

从理论基础到前沿应用:全面解析人工智能代理的核心架构、关键技术与发展趋势📅 2026 年 3 月 | 📊 深度研究报告 | 🔬 人工智能领域 | 📈 前沿技术分析**AI Agent(人工智能代理)**是一种能够感知环境、基于所获得的信息做出决策,并执行行动以影响该环境的软件系统。AI Agent 的设计旨在模仿或实现智能行为,它们可以在各种环境中操作,包括物理世界和虚拟空间。随着大语言模型(LLM)技术的突破性进展,AI Agent 正从实验室研究快速走向产业应用。根据 Gartner 发布的《2

AI天才研究院 176

HDU-1667 The Rotation Game(IDA*)

The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The blocks are marked with symbols 1, 2 and 3, with exactly 8 pieces of each kind.

idealism_xxm的专栏 486

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

hdu1667 The Rotation Game(IDA*)

题意:#字形的图形,问将中间那一块转成相同数字需要的最少步数,输出字典序最小的路径。 分析:跟hdu2234的无题I比,相对简单一点。其实也只是估价函数好理解一点,其他都差不多,还是迭代深搜+A*,也就是IDA*。 估价函数h()=8-max(在要求的八个位置中,1,2,3,的个数); 很好理解,因为没转动一步,最多只能将一个位置改为正确的。所以当前状态下,剩余的最少步数=8-max(在要求...

weixin_30432007的博客 116

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

HDU 1667 The Rotation Game(IDA*)

The Rotation Game#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;algorithm&gt; using namespace std; int map[10][10]; int _hash[8] = {3, 5, 3, 5, 5, 3, 5, 3};...

ccshijtgc的专栏 227

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

The Rotation Game HDU - 1667

The Rotation Game HDU - 1667

weixin_29216119的博客 873

HDU1667:The Rotation Game(IDA星)

Problem Description The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The blocks are marked with symbols 1, 2 and 3, with exactly 8 pieces of each kind. 

ACM!荣耀之路! 3007

The Rotation Game hdu-1667

这题的难点在于移动的表示和如何标记已经访问过的图; 参考了大牛的代码: https://www.cnblogs.com/tt123/p/3411377.html ida做法有个好处,不需要去标记图,只要不往回走就行,ida会卡住有限步数, 在最优的步数情况下,同一个图并不会重复访问。 这是ida相对bfs的一个很大的有点。 代码如下: #include <cstdio> #includ...

bloom_er的博客 181

HDU 1667 The Rotation Game IDA*搜索

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove 第一个IDA*搜索。 迭代加深搜索是逐渐加深搜深度,和BFS比较,不需要大量内存存取状态,但是耗时增加,因为好多都是重复搜索。 因为迭代加深搜索适用于对内存要求高,但是对时限要求不太高的题目。 而IDA*就是在在迭代加深搜索中

窝不是爱酱,喵~~~~ 2220

HDU1667 POJ2286 UVA1343 LA3265 The Rotation Game【IDA*】

The Rotation Game Time Limit: 45000/15000 MS (Java/Others) Memory Limit: 150000/150000 K (Java/Others) Total Submission(s): 2766 Accepted Submission(s): 1119 Problem Description The rotation gam...

海岛Blog 597

POJ 2286 HDU 1667 ZOJ 2396 The Rotation Game IDA*迭代加深搜索

The Rotation Game Time Limit: 15000MS   Memory Limit: 150000K Total Submissions: 3819   Accepted: 1262 Descriptio

魔神翼 1468

hdu 1667:The Rotation Game

ida

weixin_46266058的博客 190

HDU 1667 The Rotation Game

HDU_1667     如果我们确定要移动一类整数的话,那么其他两类整数实际上都可以看作是0,因此可以固定一个中间八个整数为1、其余整数为0的终态,然后预处理出所有可能的状态,在查询的时候只要枚举1、2、3分别作为要移动到中间整数就可以计算出最优解了。 #include&lt;stdio.h&gt; #include&lt;string.h&gt; #define HASH 1000...

weixin_34378969的博客 114

POJ 2286/HDU 1667 The Rotation Game 搜索-IDA*+迭代加深

题目地址:http://poj.org/problem?id=2286 本题若用广搜,空间需求量非常大,空间不足。深搜的话,深度很难控制,容易陷入死循环。在这个时候就要用到迭代加深的深搜方法。 所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是由于搜索的复杂度是呈指数级别增加

lamborghini1993 1690
上一篇: hdu 1556 Color the ball(树状数组)
下一篇: hdu 1823 Luck and Love(二维线段树)
accelerator_2016
博客等级 码龄11年 3粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值