Cheese Aizu - 0558 (BFS)

题目链接:https://vjudge.net/problem/Aizu-0558#author=GPT_zh

  • 题意:
    给你一个h*w的矩阵,(.代表空地。X代表障碍物,数字1~n分别代表n个不同的cheese)老鼠从起始位置S开始,挨个去找和它能力值(power)相等的cheese去吃,输出吃完n个cheese所需要的步长。

  • 思路:
    BFS搜索,即先找和power相同的cheese。
    --找到后以此cheese的位置为基准再次开始搜索
    --直到power==n+1结束搜索

  • 注意:
    BFS一定要开一个vis数组(要不然就来回搜,没有意义),并且在move的过程中将走过的点设置为false
    可以定义一个结构体 记录该点坐标以及到达此坐标的步长 这样就可以记录总步长(每次上下左右走都为steps+1,走完上一步再将总步长steps设置为此坐标下的steps)
    可以走的点有三种:"S",“.",以及其他非目标的cheese
    重新BFS时将vis全部设置为true

#include<bits/stdc++.h>
using namespace std;
struct node{
pair<int,int>pos;
int steps;
node(int x,int y,int s):pos(x,y),steps(s){
}
};
int h,w,n;int stx,sty;
char field[2000][2000];
bool visit[2000][2000];
int power=1;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
int steps=0;
void clear(queue<node>&q)
{
queue<node>empty1;
swap(empty1,q);
}
void bfs(int x,int y)
{
queue<node>qu;
node st(x,y,steps);
qu.push(st);
visit[x][y]=false;
while(!qu.empty())
{
node a=qu.front();
qu.pop();
steps=a.steps;
if(power==n+1)return;
for(int i=0;i<4;i++)
{
int nx=a.pos.first+dx[i];
int ny=a.pos.second+dy[i];
if(nx<1||nx>h||ny<1||ny>w||field[nx][ny]=='X'||visit[nx][ny]==false)continue;
else if(field[nx][ny]=='S'||field[nx][ny]=='.'||(isdigit(field[nx][ny])&&field[nx][ny]-'0'!=power))
{
qu.push((node){nx,ny,steps+1});
visit[nx][ny]=false;
}
else if(field[nx][ny]-'0'==power)
{
power++;
clear(qu);
qu.push((node){nx,ny,steps+1});
memset(visit,true,sizeof(visit));
visit[nx][ny]=false;
break;
}
}
}
}
signed main()
{
cin>>h>>w>>n;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
cin>>field[i][j];
if(field[i][j]=='S')
{
stx=i;sty=j;
}
}
}
memset(visit,true,sizeof(visit));
bfs(stx,sty);
cout<<steps<<'\n';
return 0;
}
  • 知识点:
    STLqueue队列的清空没有clear方法可以直接调用
    那么我们可以定义一个void clear(queue&q)
    在函数里开一个空的queue 并与引用的队列 swap
posted @   Marinaco  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示