FZU 2196 基础搜索 BFS 八

本文介绍了一道编程题FZU 2196的解题思路,利用带有岩浆蔓延特性的广度优先搜索(BFS)算法解决迷宫中人物逃离的问题。文章详细解释了如何实现人与岩浆交替移动的BFS过程,并特别指出在实现过程中需要注意的一个细节:判断人物行动点在等待期间是否被岩浆覆盖。

 

FZU  2196 :http://acm.fzu.edu.cn/problem.php?pid=2196

题意: 给出一个起点,终点,墙壁,通路,岩浆

           人先走,上下左右一次移动一格。

          岩浆后走,每次向上下左右蔓延周围各一格。

         问,人能否到达终点

 

一眼看出,附带岩浆的BFS。

 

思路:先将人装入队列,再将岩浆装入队列。

           便具有了,一个队列,但是具有人先走岩浆后走的特性。

           队列里装入的是点的位置以及,是岩浆还是人的区分变量sex。

          每一次根据取出元素是人还是岩浆的不用进行不同的BFS标记操作。

          book为标记数组。通路为-1,岩浆为0,墙壁也为0,人走过的点为1。则人能走的条件是,此点为-1,岩浆蔓延的条件是此点不为0(为了可以蔓延走过的1点)。

 

注意点:  交了一发没有过,有一个细节要注意:    

         假设有一个位置点X, 此点无岩浆,无人走过,所以标记为1入队。 但是之后的岩浆可能把这个位置给淹没了!! 这种情况,理论上就不能对这个点进行拓展了。

         所以对每一个人放入的可走点,要加入一个判断,此点是否在放在队列等待的时间内,被岩浆覆盖了。

 

上BFS代码:

 

#include"cstdio"
#include"cstring"
#include"queue"
#include"iostream"
#include"algorithm"
using namespace std;
#define inf 1009
#define loop(x,y,z) for(x=y;x<z;x++)

int T,n,m,sx,sy,gx,gy;
char pos[inf][inf];
int book[inf][inf];
int change[4][2]={0,1,0,-1,-1,0,1,0};
struct point                                  //存放了入队点信息,行、列、以及人走的点为1,岩浆走的点为0
{
    int x,y;
    int sex;
    point(int i,int j,int k)
    {
        x=i;y=j;sex=k;
    }
};
queue<point>q;

void init()                                   //初始化函数
{
    memset(book,-1,sizeof book);
    while(!q.empty())q.pop();
}
 
int pan(int i,int j)                            //判断有无越界函数
{
    if(i<0||i>=n||j<0||j>=m)return 0;
    return 1;
}

void bfs()
{
    int i,j;
    loop(i,0,n)
        loop(j,0,m)
            if(pos[i][j]=='S')                     //起点入队标记,记录终点位置
            {
                q.push(point(i,j,1));
                book[i][j]=1;
            }
            else if(pos[i][j]=='E')
            {
                gx=i;gy=j;
            }
    loop(i,0,n)                                    //岩浆入队标记
        loop(j,0,m)
            if(pos[i][j]=='!')
            {
                q.push(point(i,j,0));
                book[i][j]=0;
            }
            else if(pos[i][j]=='#')
                book[i][j]=0;
    while(!q.empty())
    {
        point t=q.front();
        q.pop();
        int sex=t.sex;
        if(sex)                                           //如果是人走的点
        {
            if(book[t.x][t.y]==0)continue;               //如果这个点在队列等待时间里被岩浆淹没了,就不进行拓展了
            loop(i,0,4)
            {
                int nowx=t.x+change[i][0];
                int nowy=t.y+change[i][1];
                if(pan(nowx,nowy)&&book[nowx][nowy]==-1)    //合法点标记入队
                {
                    book[nowx][nowy]=1;
                    q.push(point(nowx,nowy,1));
                    if(book[gx][gy]==1)                  //若终点拓展成功,输出Yes
                    {
                        printf("Yes\n");return;
                    }
                }
            }
        }
        else                                            //如果是岩浆走的点
        {
            loop(i,0,4)
            {
                int nowx=t.x+change[i][0];
                int nowy=t.y+change[i][1];
                if(pan(nowx,nowy)&&book[nowx][nowy]!=0)     //只需要标记并入队就好
                {
                    book[nowx][nowy]=0;
                    q.push(point(nowx,nowy,0));
                }
            }
        }
    }
    printf("No\n");
}

int main()
{
    int i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        init();
        loop(i,0,n)
        scanf("%s",pos[i]);
        bfs();
    }
    return 0;
}

 

 

 

 

 

代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制与早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...
代码转载自:https://pan.quark.cn/s/46fd08fb879c 网管教程 从入门到精通软件篇 ★一。★详尽的xp修复控制台指令及其应用!!! 放入xp(2000)的光盘,安装时选择R,执行修复! Windows XP(涵盖 Windows 2000)的控制台指令是在系统遭遇某些意外状况时的一种极具效用的诊断、检测以及恢复系统功能的工具。笔者确实一直期望能够将这方面的指令进行归纳,此次由老范辛苦整理了这份极具价值的秘籍。 Bootcfg bootcfg 命令用于启动配置与故障恢复(对大多数计算机而言,即 boot.ini 文件)。 带有特定参数的 bootcfg 命令仅在运用故障恢复控制台时方可使用。能够在命令行界面下运用带有不同参数的 bootcfg 命令。 用法: bootcfg /default 设定默认引导选项。 bootcfg /add 向引导清单中增添 Windows 安装。 bootcfg /rebuild 重复整个 Windows 安装流程并让用户选择需添加的项目。 注意:运用 bootcfg /rebuild 之前,应先借助 bootcfg /copy 命令备份 boot.ini 文件。 bootcfg /scan 探查用于 Windows 安装的全部磁盘并展示结果。 注意:这些结果被静态存储,并用于当前会话。若在当前会话期间磁盘配置发生变动,为获取更新的探查结果,必须先重启计算机,然后再次探查磁盘。 bootcfg /list 列示引导清单中已有的项目。 bootcfg /disableredirect 在启动引导程序中禁用重定向。 bootcfg /redirect [ PortBaudRrate] |[ useBio...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值