题解 P1374 【进攻幽暗城】

· · 题解

[ 更好的阅读体验 ]

[ 原题面 ]

第零部分 —— 阅读题目

第一部分 —— 开始分析

第三部分 —— 深入思考

第五部分 —— 代码实现

for (int i=1; i<=100; ++i)  //生成100次之内的位置
{
    int tx = Lorx[i-1]+bak[st_Lor[(i-1)%st_Lor.length()]-48];   //Bak即位置预处理数组
    int ty = Lory[i-1]+bak[st_Lor[(i-1)%st_Lor.length()]-43];   //此时减去43是因为在减48的同时要加5,因为这是对y坐标的更改,不能和x坐标混淆
    if ((tx<1)||(tx>n)||(ty<1)||(ty>m)) //走出边界
        tx = Lorx[i-1],ty = Lory[i-1];
    else if (Map[tx][ty] == 1)  //撞上墙
        tx = Lorx[i-1],ty = Lory[i-1];
    Lorx[i] = tx,Lory[i] = ty;

    tx = Salx[i-1]+bak[st_Sal[(i-1)%st_Sal.length()]-48];
    ty = Saly[i-1]+bak[st_Sal[(i-1)%st_Sal.length()]-43];
    if ((tx<1)||(tx>n)||(ty<1)||(ty>m))
        tx = Salx[i-1],ty = Saly[i-1];
    else if (Map[tx][ty] == 1)
        tx = Salx[i-1],ty = Saly[i-1];
    Salx[i] = tx,Saly[i] = ty;
}
void Search(int Max_Deep,int now,int nx,int ny,int Leave_Time)
{
    if (现在层数大于最大层数 或 离开时间大于s)
        return;
    if (到达魔王的位置)
    {
        printf("%d\n", now);
        exit(0);
    }
    now ++; //开始走
    for (int i=0; i<5; ++i)//五种方案:上下左右或者不动
    {
        int tx = nx+bak[i];
        int ty = ny+bak[i+5];
        int tk = Leave_Time;
        if ((tx<1)||(tx>n)||(ty<1)||(ty>m))
            continue;
        if (Map[tx][ty] == 1)
            continue;
        if (dist(tx,ty,Salx[now],Saly[now]) > r)
            tk++;
        else tk = 0;
        Search(Max_Deep,now,tx,ty,tk);
    }
}

第六部分 —— 后记