pku3009 Curling 2.0 WA了艾。。。最近很不顺阿。。。。。。。。。

AID智能抄表子卡原理图PDF 立即下载

/*




Curling 2.0
Time Limit: 1000MS        Memory Limit: 65536K
Total Submissions: 1905        Accepted: 736

Description

On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.

Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.) Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.


Fig. 1: Example of board (S: start, G: goal)

The movement of the stone obeys the following rules:

    * At the beginning, the stone stands still at the start square.
    * The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
    * When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
    * Once thrown, the stone keeps moving to the same direction until one of the following occurs:
          o The stone hits a block (Fig. 2(b), (c)).
                + The stone stops at the square next to the block it hit.
                + The block disappears.
          o The stone gets out of the board.
                + The game ends in failure.
          o The stone reaches the goal square.
                + The stone stops there and the game ends in success.
    * You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.


Fig. 2: Stone movements

Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.

With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration has changed as in Fig. 3(b).


Fig. 3: The solution for Fig. D-1 and the final board configuration

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.

Each dataset is formatted as follows.

    the width(=w) and the height(=h) of the board
    First row of the board
    ...
    h-th row of the board

The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.

Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.

    0     vacant square
    1     block
    2     start position
    3     goal position

The dataset for Fig. D-1 is as follows:

    6 6
    1 0 0 2 1 0
    1 1 0 0 0 0
    0 0 0 0 0 3
    0 0 0 0 0 0
    1 0 0 0 0 1
    0 1 1 1 1 1

Output

For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have any character other than this number.

Sample Input

2 1
3 2
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
6 1
1 1 2 1 1 3
6 1
1 0 2 1 1 3
12 1
2 0 1 1 1 1 1 1 1 1 1 3
13 1
2 0 1 1 1 1 1 1 1 1 1 1 3
0 0

Sample Output

1
4
-1
4
10
-1

Source
Japan 2006 Domestic
*/




#include <iostream>
#include <vector>
using namespace std;

int goaltime = 60000;

void dfs(int  blocks[][22],int s1,int s2,int g1,int g2,int time,int w,int h)
{
    if(time > 10 || time >= goaltime)
    {
        return;
    }
    if(s1 == g1)
    {
        int tmp1,tmp2;
        int sign1 = 0;
        if(s2 < g2)
        {
            tmp1 = s2;
            tmp2 = g2;
        }
        else
        {
            tmp1 = g2;
            tmp2 = s2;
        }
        if(tmp1 + 1 == tmp2)
        {
            time++;
            if(time <= 10 && goaltime > time)
            {
                goaltime = time;
            
                
            }
            return;
        }
        else
        {
            for(int a = tmp1 + 1;a < tmp2;a++)
            {
                if(blocks[s1][a] == 1)
                {
                    sign1 = 1;
                    break;
                }
            }
            if(sign1 == 0)
            {
                time++;
                if(time <= 10 && goaltime > time)
                {
                    goaltime = time;
            
                }
                return;
            }
        }

    }
    if(s2 == g2)
    {
        int tmp11,tmp22;
        int sign2 = 0;
        if(s1 < g1)
        {
            tmp11 = s1;
            tmp22 = g1;
        }
        else
        {
            tmp11 = g1;
            tmp22 = s1;
        }
        if(tmp11 + 1 == tmp22)
        {
            time++;
            if(time <= 10 && goaltime > time)
            {
                goaltime = time;
        
                
            }
            return;
        }
        else
        {
            for(int z = tmp11 + 1;z < tmp22;z++)
            {
                if(blocks[s1][z] == 1)
                {
                    sign2 = 1;
                    break;
                }
            }
            if(sign2 == 0)
            {
                time++;
                if(time <= 10 && goaltime > time)
                {
                    goaltime = time;
            
                }
                return;
            }
        }

    }
    else
    {
        
        if(s2 - 1 >= 0 && blocks[s1][s2 - 1] == 0)
        {
            for(int hj = s2 - 2;hj >= 0;hj--)
            {
                if(blocks[s1][hj] == 1)
                {
                    blocks[s1][hj] = 0;
                    blocks[s1][s2] = 0;
                    dfs(blocks,s1,hj + 1,g1,g2,time + 1,w,h);
                    blocks[s1][hj] = 1;
                    blocks[s1][s2] = 2;
                    break;
                }
            }
        }
        if(s2 + 1 < w && blocks[s1][s2 + 1] == 0)
        {
            for(int k = s2 + 2;k < w;k++)
            {
                if(blocks[s1][k] == 1)
                {
                    blocks[s1][k] = 0;
                    blocks[s1][s2] = 0;
                    dfs(blocks,s1,k - 1,g1,g2,time + 1,w,h);
                    blocks[s1][k] = 1;
                    blocks[s1][s2] = 2;
                    break;
                }
            }
        }
        if(s1 - 1 >= 0 && blocks[s1 - 1][s2] == 0)
        {
            for(int u = s1 - 2;u >= 0;u--)
            {
                if(blocks[u][s2] == 1)
                {
                    blocks[u][s2] = 0;
                    blocks[s1][s2] = 0;
                    dfs(blocks,u + 1,s2,g1,g2,time + 1,w,h);
                    blocks[u][s2] = 1;
                    blocks[s1][s2] = 2;
                    break;
                }
            }
        }
        if(s1 + 1 < h && blocks[s1 + 1][s2] == 0)
        {
            for(int m = s1 + 2;m < h;m++)
            {
                if(blocks[m][s2] == 1)
                {
                    blocks[m][s2] = 0;
                    blocks[s1][s2] = 0;
                    dfs(blocks,m - 1,s2,g1,g2,time + 1,w,h);
                    blocks[m][s2] = 1;
                    blocks[s1][s2] = 2;
                    break;
                }
            }
        }
    }
    return;
}

int main(void)
{
    int w,h;
    int s1,s2,g1,g2;
    int blocks[22][22];
    while(cin>>w>>h)
    {
        if(w == 0 || h == 0)
        {
            break;
        }
        else
        {
            for(int i = 0;i < h;i++)
            {
                for(int j = 0;j < w;j++)
                {
                    cin>>blocks[i][j];
                    if(blocks[i][j] == 2)
                    {
                        s1 = i;
                        s2 = j;
                    }
                    else if(blocks[i][j] == 3)
                    {
                        g1 = i;
                        g2 = j;
                    }
                }
            }
            dfs(blocks,s1,s2,g1,g2,0,w,h);
            if(goaltime == 60000)
            {
                cout<<-1<<endl;
            }
            else
            {
                cout<<goaltime<<endl;
            }
            goaltime = 60000;
        
        }
    }

    return 0;
}

测试了题目里的数据还有讨论里的所有数据也都测了。。。WA。。。(为了找测试数据都跑到日本人的BLOG里去找了。。。。。。。。。。)

但是这题收获非常大。。。。。。。。。首先完全搞清楚了一个区别

void dfs(int a[],int x)

void dfs(vector<int> a,int x)

void dfs(vector<int> &a,int x)

第一个在函数内部对数据的更改成立

第二个在函数内部的更改实际上是无效的

而第三个对应本题的情况是在函数体内 比如函数里有2个递归 dfs(a,1);dfs(a,2);那么在每个递归里对数据的修改是成立的。。而当到第2个递归是vector a实际上又变回了原来那个。。注意这里是因为vector自行进行了复制。。。所以

  dfs(blocks,u + 1,s2,g1,g2,time + 1,w,h);
                    blocks[u][s2] = 1;
                    blocks[s1][s2] = 2;
                    break;

如果是使用vector & 那么

    blocks[u][s2] = 1;
    blocks[s1][s2] = 2;

因为vector自动以再复制的方式把数组恢复了。。。但是这样浪费了时间所以会TLE

所以要记住正确的办法应该是用int(即不整个把数组复制一遍)然后在递归的后面加上那2句局部还原。

另外这题向我那样前面if(s1 == g1)什么的完全都是罗嗦根本可以不要直接在4个递归里判断,懒的改了。。。。。。。。

【AI方案集】AI与人机协作相结合的智能法律咨询系统.docx AI技术方案以算力、算法、数据三角协同为核心,通过搭建标准化的数据预处理、模型训练与边缘云端协同部署流程,将计算机视觉、自然语言处理、机器学习等核心能力深度融入业务场景,既实现自动化流程降本提效,又通过精准的模式识别与预测分析为管理层提供数据驱动的决策支撑,最终完成从通用AI技术到行业定制化场景的适配落地,为企业数字化转型提供可落地的技术路径。 立即下载

相关推荐

picture again

picture again

pku 3009 Curling 2.0 DFS

http://poj.org/problem?id=3009 注意两点: 1:只有当冰壶的所有可能走的方向上有0可以移动时,他才能移动,这里就是这组数据的解释 6 1 1 1 2 1 1 3 因为2左右都是1不能移动座椅不能走。2:但冰壶蹦到障碍物时,障碍物会破碎,此处就会变成可以走的路线了。 View Code #include <cstdio> #include...

weixin_30906701的博客 99

计算机二级通关宝典1计算机二级通关宝典

计算机二级通关宝典1计算机二级通关宝典

pku 3009 Curling 2.0 DFS+剪枝

开始用第一种方式写的,总是WA,郁闷,至今还不知为啥,希望高人指点,用第二种方式写后,AC. if(step > 10)  return;这样剪枝后,168k, 250ms.再剪枝,if(step > 10 || step >= minStep)  return;168k 79ms. //WA#include using namespace std;

笑风生 653

AI聚合api网关系统源码+部署教程

AI聚合api网关系统源码+部署教程

MobaXterm终端工具个人学习版安装包及常用配置备份

资源包含 MobaXterm 个人版的安装包以及日常运维常用的基础配置备份文件。适用于网络工程师及运维人员用于日常的服务器管理、SSH 连接及串口调试。 压缩包内附带了个人整理的软件使用技巧与配置说明(仅供个人学习参考)。请各位同行下载后注意,技术工具请尽量支持官方正版,本资源仅供个人测试与交流使用,切勿用于商业环境。

三电平维也纳VIENNA双闭环控制整流器仿真(Simulink仿真实现)

内容概要:本文档系统介绍了“三电平维也纳VIENNA双闭环控制整流器”的Simulink仿真资源,重点涵盖电压电流双闭环控制、中点电位平衡控制及SVPWM调制等核心技术,服务于高精度电力电子系统的建模与优化。资源包不仅包含三相维也纳整流器、双有源桥DAB变换器、LLC谐振变换器等多种典型拓扑的仿真模型,还整合了Mathcad计算书、参考文献、MATLAB代码及设计报告等配套材料,突出科研复现与工程设计双重价值。特别针对控制策略优化、软开关技术实现、最小应力控制等前沿方向提供顶级EI期刊级别的复现案例,强化理论深度与实践指导意义。; 适合人群:面向具备电力电子、自动控制或电气工程等相关专业背景的研究生、科研人员及从事新能源、电力变换系统开发的工程技术人员,尤其适合正在进行高性能整流器与DC-DC变换器研究的专业人士。; 使用场景及目标:①支持高校与科研机构在三电平整流器、功率因数校正(PFC)、DC-DC变换器等领域开展控制系统建模与算法验证;②助力高质量学术论文复现(如EI/SCI期刊)、硕士/博士课题研究、毕业设计及企业级项目开发;③深入掌握SVPWM调制、双闭环动态调节、中点电位平衡控制等关键电力电子控制技术的实现机制与参数整定方法。; 阅读建议:建议结合提供的完整资源目录循序渐进地学习,优先研读控制框图与数学建模部分,理解控制逻辑与参数设计原理后,再通过Simulink平台进行仿真实验与参数调试,注重理论推导与仿真结果的对比分析,全面提升科研创新能力与工程实践能力。

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

jp-host-release.apk

jp-host-release.apk

科技中介服务机构如何借助平台提升技术撮合服务的专业性与响应速度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区如何利用AI技术提升科技成果转化服务的响应速度与转化成功率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

储能双向Buck-Boost+模型预测电流控制+电压下垂控制仿真【附参考文献】(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的储能双向Buck-Boost变换器仿真模型,重点实现了模型预测电流控制(MPC)与电压下垂控制相结合的先进控制策略。该系统通过精确预测电感电流与动态调节母线电压,有效提升了储能系统在充放电切换过程中的动态响应速度、运行稳定性与抗扰动能力。模型充分考虑了实际应用场景中的非理想因素,结合参考文献进行了算法优化与参数设计,增强了方案的技术可行性与工程实用价值,适用于微电网、分布式能源系统及多储能单元并联运行的能量协调管理。; 适合人群:电气工程、自动化、新能源技术及相关领域的科研人员、研究生以及从事电力电子变换器与智能电网控制系统研发的工程师。; 使用场景及目标:①深入研究双向DC-DC变换器在储能系统中的高性能控制方法;②掌握模型预测控制与下垂控制的协同设计原理及其在复杂工况下的动态调节机制;③为微电网能量管理、多源协同控制、电压频率支撑等关键技术提供可靠的仿真验证平台。; 阅读建议:建议结合提供的Simulink模型与参考文献进行系统学习,重点关注控制器结构设计、预测模型建立及控制参数整定过程,可通过调整负载突变、设定不同工作模式等方式开展仿真实验,深入理解控制策略的鲁棒性与适应性表现。

11232131231231是的

11232131231231是的

【用于无人机控制的深度强化学习】使用深度确定性策略梯度通过连续状态空间中的过渡来控制倾转旋翼无人机(Matlab代码实现)

内容概要:本文围绕Plecs全桥LLC谐振变换器的仿真模型展开,重点介绍了基于Plecs或Simulink平台构建的全桥LLC谐振变换器的建模方法与仿真分析过程。内容涵盖LLC谐振变换器的工作原理、关键参数设计、PFM(脉冲频率调制)控制策略的实现,以及谐振腔的精确建模与仿真验证。通过该仿真模型,可深入分析变换器在不同负载条件下的效率表现、软开关实现情况、电压增益特性及动态响应性能,适用于高频高效电源系统的设计与优化。文档还配套提供了完整的仿真模型、设计报告与计算书等参考资料,有助于读者系统掌握LLC变换器的设计流程与工程应用要点。; 适合人群:具备电力电子与电源变换基础知识,从事高频开关电源、DC-DC变换器设计等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高校科研中LLC谐振变换器的建模与先进控制策略研究;②指导企业研发人员完成高效率电源产品的仿真验证与优化设计;③作为电力电子技术课程的教学案例,帮助学生理解谐振变换器的动态特性、软开关机理与系统级仿真方法。; 阅读建议:建议读者结合所提供的仿真模型与设计文档,逐步搭建并调试全桥LLC变换器系统,重点关注谐振参数的匹配原则、PFM控制逻辑的实现细节以及软开关的实现条件,并通过对比不同工况下的仿真结果,深入分析控制策略对系统效率与动态性能的影响,以实现理论学习与工程实践的深度融合。

基于双向Buck-Boost电路的锂电池储能充电+放电控制Simulink仿真

内容概要:本文档详细介绍了一种基于双向Buck-Boost电路的锂电池储能系统充放电控制的Simulink仿真模型,重点实现了充电与放电过程中双向能量流动的精确控制。通过Simulink平台构建完整的电路拓扑与控制系统,采用电压、电流双闭环控制策略,有效提升了系统的稳定性与能量转换效率。文档不仅提供了详细的仿真建模方法,还结合参考文献增强了理论支撑,具有较高的科研与工程应用价值。此外,文中列举了大量电力电子领域的相关仿真资源,涵盖LLC谐振变换器、PFC电路、PWM整流器、状态估计等多种技术方向,形成了一个综合性强、覆盖面广的技术资料库,便于研究人员拓展学习和复用设计。; 适合人群:电气工程、自动化、新能源等相关专业的研究生、科研人员及从事电力电子系统设计的工程师。; 使用场景及目标:①研究锂电池储能系统的双向能量管理与高效充放电控制策略;②掌握基于Simulink的电力电子系统建模与闭环控制器设计方法;③为科研项目、毕业设计或工程开发提供可复现的仿真案例与技术支持。; 阅读建议:建议结合文档中提供的参考文献与外部资源链接,系统性地学习Buck-Boost电路的工作原理与控制理论,优先理解基础拓扑运行机制后再深入双闭环控制策略的设计与参数整定,同时可参照同系列其他仿真案例进行对比分析与拓展实践。

【Trans论文复现】基于Agent的电力市场深度决策梯度(深度强化学习)算法建模研究(Python代码实现)

内容概要:本文详细介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,聚焦于利用PLECS仿真工具对隔离型全桥LLC谐振变换器进行建模、参数设计与性能分析。该资源系统阐述了LLC谐振变换器的工作原理,涵盖谐振参数设计、软开关实现机制、效率优化等关键技术环节,并配套提供了完整的仿真模型、设计报告与计算书,便于用户深入理解其在高效率、软开关功率转换中的优势与应用。研究内容不仅支持理论学习,还可用于控制策略的验证与优化设计,具有较强的工程实践价值。; 适合人群:具备电力电子技术基础知识,从事开关电源、高频功率变换器研发及相关领域研究的工程技术人员与高校研究生。; 使用场景及目标:①用于全桥LLC谐振变换器的教学演示与原理学习;②支持科研人员开展高效DC-DC变换器的建模、仿真与优化设计;③为掌握PLECS在电力电子系统仿真中的高级应用提供详实案例。; 阅读建议:建议结合PLECS仿真软件进行实际操作,通过运行仿真模型并对照设计文档,深入理解电路各模块功能、参数设置依据及软开关实现条件,重点关注谐振腔参数对系统效率与动态响应的影响,以全面提升对LLC变换器工作特性的认知水平与工程设计能力。

ICD10达梦sql语句

ICD10达梦sql语句

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 214
上一篇: PKU 3083 Children of the Candy Corn 这题感触很多。。。。。。。。。。。。。。
下一篇: pku1321 棋盘问题 依然是DFS
zonelight
博客等级 码龄19年 8粉丝 34原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值