UVALive 7297 bfs

本文介绍了一种基于图论的问题解决思路,通过BFS算法模拟小偷与警察之间的追逐过程,考虑了警察携带狗增加的追赶速度,以及如何判断小偷是否有办法逃脱。

题意 一个小偷偷到了项链 他想知道自己是否可以逃出去 地图中有一个小偷 一个警察 警察有一条狗 一开始 小偷和警察的移动速度都是1 当警察走到小偷经过过的地方时 警察会有一条狗嗅到小偷的气味并且以2的速度去追 

由于问题问的是 小偷是否必定有方法逃出 所以我们可以看作 有无限个警察从一个点出发去抓小偷 每经过一个点 这个点上就会有一个警察站着

所以会有一个limit来记录警察到达这个点的最短的时间 我们可以想到 小偷到这个点的时间和警察到达这个点的时间的差 就是小偷到这个点之后可以行动的时间(如果他以正确的方式移动 他将会在这个时间之后被之后到达这个点的警察的狗以速度2抓到)

所以 我使用t记录小偷从一开始进行的移动时间 lim记录小偷被追到的时间

可以看出 小偷每到一个点 他都会面对一个会在之后的某个时间正常速度走到这个点的警察 这个警察会在之后的某个时间抓到他 而这个时候 小偷背后还有很多个警察 他们也会在某个时间抓到小偷 所以每到一个点 就把到这个点的警察与小偷背后的最快的警察 两个人追到小偷的时间做对比 保留最快的警察

需要注意的是由于这个图是50*50的(然而即使开一个60*60的数组也并不能通过 需要更大) 所以 如果我们不对状态进行限制(加上类似于vis数组的东西) 会超时 并且涛哥提示我 这个点的lim是由小偷到这个点的t和limit[x][y]共同决定的 所以无论这个vis数组记录的是当前时间还是小偷被抓到的时间亦或是小偷可以移动的时间 都是可以的

本来是用j数组来记录最小时间控制这个点的状态压入的 但是只用小偷到达这个点的是与否记录的话 也是可以通过的 我认为是 在普通的移动bfs里面 由于小偷是没有其他状态的 所以 先到的 更好

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<iostream>
using namespace std;
int n , m;
int limit[550][550];
char mp[600][600];
int j[550][550];
struct node
{
    int t;
    int x,y;
    int lim;
};
int stx,sty;
int px,py;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
bool check(int x,int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=m)
    {
        if(mp[x][y]!='X')
        {
            return true;
        }
    }
    return false;
}
void bfs1()
{
    node f;
    f.t=0;
    memset(limit,-1,sizeof(limit));
    f.x=px;
    f.y=py;
    queue<node >q;
    q.push(f);
    limit[f.x][f.y]=0;
    while(!q.empty())
    {
        f=q.front();
        q.pop();
        for(int i =0; i<4; i++)
        {
            node s= f;
            s.x+=dx[i];
            s.y+=dy[i];
            s.t++;
            if(check(s.x,s.y)&&(limit[s.x][s.y]==-1||limit[s.x][s.y]>s.t))
            {
                limit[s.x][s.y]=s.t;
                q.push(s);
            }
        }
    }
}
bool bfs2()
{
    queue<node >q;
    node f;
    f.x=stx;
    f.y=sty;
    f.t=0;
    f.lim=limit[f.x][f.y]*2;
    memset(j,-1,sizeof(j));
    q.push(f);
    while(!q.empty())
    {
        f=q.front();
        q.pop();
        if(mp[f.x][f.y]=='E')
        {
            return true;
        }
        for(int i=0; i<4; i++)
        {
            node s= f;
            s.x+=dx[i];
            s.y+=dy[i];
            s.t++;
            if(check(s.x,s.y))
            {
                if(s.t<limit[s.x][s.y])
                {
                    if(s.t<s.lim)
                    {
                        if(j[s.x][s.y]==-1||j[s.x][s.y]>s.lim)
                        {
                            j[s.x][s.y]=s.lim;
                            int nexlim=limit[s.x][s.y]*2-s.t;
                            s.lim=min(s.lim,nexlim);
                            q.push(s);
                        }
                    }
                }
            }
        }
    }
    return false;
}
int main()
{
    while(cin>>m>>n)
    {
        if(m==0&&n==0)
            break;
        getchar();
        for(int i = 1; i<= n; i++)
        {
            gets(mp[i]+1);
        }
        for(int i = 1; i<= n; i++)
        {
            for(int k = 1; k<= m; k++)
            {
                if(mp[i][k]=='T')
                {
                    stx=i;
                    sty=k;
                }
                if(mp[i][k]=='K')
                {
                    px=i;
                    py=k;
                }
            }
        }
        bfs1();
        if(bfs2())
        {
            printf("KEEP IT\n");
        }
        else
        {
            printf("DROP IT\n");
        }
    }
}

  

转载于:https://www.cnblogs.com/rayrayrainrain/p/5747454.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值