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 @ 2024-12-18 20:40  Marinaco  阅读(12)  评论(0)    收藏  举报
//雪花飘落效果