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

本文详细解析了一种基于迷宫的游戏——Curling2.0的算法实现过程,该游戏的目标是最小化石头从起点到终点所需的移动次数。文章深入探讨了如何通过深度优先搜索(DFS)来寻找最优路径,并分享了在算法实现过程中的一些关键发现,如不同数据结构在递归调用中对于时间和空间的影响。

/*




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个递归里判断,懒的改了。。。。。。。。

内容概要:本文是一份锂电池基础知识的学习课件,系统介绍了锂电池的种类、方形电池的结构与制造工艺流程,以及出货不良的常见类型与分析。文章首先按形状和材料体系对方形、圆柱、软包等锂电池进行分类,并重点对比了钴酸锂、锰酸锂、三元材料和磷酸铁锂在电压、能量密度、循环寿命、成本和安全性等方面的差异。随后详细阐述了方形电池的内部结构,包括正负极柱、盖板组件、防爆阀、极组和隔膜等关键部件的功能与设计原理。在工艺部分,全面讲解了从匀浆、涂布、辊压、模切到装配、焊接、注液、化成等全流程的关键步骤、技术参数与质量控制要点,尤其对叠片与卷绕工艺进行了深入对比。最后,针对生产中常见的出货不良问题,如厚度、电压、容量、外观等方面异常,进行了归因分析与改进方向说明。; 适合人群:从事锂电池研发、生产、品质管理等相关工作的技术人员,以及对电池制造工艺感兴趣的工程类学生或初学者。; 使用场景及目标:①用于锂电池生产工艺培训与知识普及;②作为现场工艺优化与不良问题分析的参考依据;③帮助理解电池结构设计与性能之间的关系,提升工艺控制能力。; 阅读建议:建议结合实际生产流程图与设备操作规范对照学习,重点关注各工艺环节的技术参数设定与失效模式,便于在实际工作中快速定位和解决质量问题。
下载代码方式:https://pan.quark.cn/s/5bafd19a7805 创维E900 4K智能机顶盒是一款专门为高清电视节目设计的设备,其特点是配置过程迅速便捷,非常适合那些喜欢自行安装软件以及具备较强实践操作能力的用户群体。在开始配置之前,用户必须确认所有硬件设备均已正确连接,这包括使用HDMI或MiniCVBS线缆将机顶盒与电视机相连接,同时核实电视信号源已设定无误,此外还需连接电源适配器,并确保网线已正确接入机顶盒与光猫或家庭网络设备,且网络状态良好。尤其需要注意,采用有线网络连接通常比无线连接方式更为稳定,能够有效避免因网络波动或卡顿所引发的异常情况,进而保障机顶盒的正常运行。配置向导包含若干步骤,首要环节是平台的选择。在机顶盒启动后,于视频播放结束界面进入“平台选择”功能,用户需依据自身所在地域挑选适当的平台,例如华为平台或中兴平台等。完成平台选定后,接下来的步骤是设定IPTV业务的用户名和密码,这是接入IPTV服务的必要前提。随后是接入方式的选择环节,用户应依据实际的网络环境决定采用有线还是无线接入。鉴于有线网络通常更为可靠,因此推荐采用有线接入方式。在网络配置环节,智能机顶盒通过DHCP协议与家庭网关建立连接。配置流程结束后,用户将进入launcher桌面,该界面是机顶盒的主要用户交互界面,负责展示各类应用及服务。若在初次配置完成后进入launcher桌面时遭遇加载时间过长或因网络连接问题无法显示桌面的情况,用户应当检查网络配置是否准确,并核实机顶盒已成功接入互联网。在整个配置过程中,用户或许会碰到各类错误提示信息,如IPTV业务账号或密码设置错误、网络未成功连接、接入平台未能实现以及特定的错误编号等。这些错误提示通常意味着需要重新...
代码下载链接: https://pan.quark.cn/s/129d2f33dfde 《小米平板5 Pro 5G版基带QCN文件解析》 小米平板5 Pro 5G版是一款配备了前沿5G通信技术的智能设备,其内部的基带芯片是构建高速无线网络连接的核心构成部分。基带,英文全称为Baseband,是手机或平板电脑中的核心单元,承担着处理无线通信所有基础信号处理任务的责任,包括数据的解码与编码,使其能够顺利在移动网络中传输。在本讨论中,我们将详尽研究“小米平板5 Pro 5G版【代码ENUMA】完整设备备份基带qcn”这一核心知识点。 基带QCN文件是专属于小米平板5 Pro 5G版的一种固件文件,其中存储了设备的无线通信参数及配置详情。QCN全称为Qualcomm Communication Network,是由高通公司(Qualcomm)为其基带芯片定制的一种文件格式,用于储存网络设置和密钥数据。该QCN文件是设备在制造时预置的,一般与设备的IMEI(国际移动设备识别码)相联结,旨在保证设备在网络中的独特性和安全性。 在所述内容中提及的“完整设备备份的基带qcn”,指的是从状态良好的小米平板5 Pro 5G版设备上提取并保存下来的基带文件。备份基带QCN文件的主要意图是为了在设备遭遇故障,例如系统崩溃、升级失误或基带损坏等情况时,能够迅速恢复至正常运作的状态。此外,备份的基带QCN文件同样适用于固件刷新爱好者,使其在安装新的固件或定制ROM时维持网络功能的完整性。 然而,需要留意的是,“推荐修改原始串码在使用”的提示显示,如果打算使用这个备份的基带QCN文件,可能需要将文件内的IMEI信息调整为与目标设备相吻合的IMEI。这是由于IMEI作为设备的身份象征,每个设备...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值