Problem B bfs

本文解析了一道关于寻找最短路径以营救被困朋友的算法题目。通过使用宽度优先搜索(BFS)算法,文章详细阐述了如何在包含墙壁、道路及守卫的监狱地图中找到从指定起点到目标位置的最短时间。
                                                                                                            Problem B
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 15 Accepted Submission(s) : 0
Problem Description
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.

Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.

You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)


Input

First line contains two integers stand for N and M.

Then N lines follows, every line has M characters. "." stands for road, "a" stands for Angel, and "r" stands for each of Angel's friend.

Process to the end of the file.


Output

For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life."


Sample Input

7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........


Sample Output

13

营救天使

思路很简单~ 但是在做的题声明队列的时候 本应该是queue<Node> q 写成了queue<int> q 就郁闷了~ 这道题 在题库里交一直是CE 但是原题交就过了~

而且在开始入队的时候 没有注意入队的位置 也是一直没过的原因之一 最后的时候要注意图的存入

代码:

#include<iostream>
#include<queue>
#include<string.h>
#include<algorithm>
#include<cstdio>
#include<stdlib.h>
using namespace std;
#define maxn 201
int dir[4][2]={
    {1, 0},
    {0, 1},
    {-1, 0},
    {0, -1},
};
bool vis[maxn][maxn];
int map[maxn][maxn];
struct Node
{
	int x,y;
	int step;
}node;
int n,m;
int x1,y1,x2,y2;
int dax,day;
int bfs()
{
	
	Node now,next;
	memset(vis,0,sizeof(vis));
	queue<Node> q;
	now.x=x1;
	now.y=y1;
	now.step=0;
	q.push(now);
	vis[now.x][now.y]=1;	
	if(x1==x2&&y1==y2)
	return now.step;	
	while(!q.empty())
	{
		now=q.front();
		
	//	cout<<now.step<<endl;
		q.pop();		
	
		for(int i=0;i<4;i++)
		{
			next.x=now.x+dir[i][0];
			next.y=now.y+dir[i][1];
			
			if(next.x==x2&&next.y==y2)			
			{
				return next.step-1;
			}
		    
			if(next.x<=m&&next.y<=n&&next.x>=0&&next.y>=0&&!vis[next.x][next.y]&&map[next.x][next.y]==0)
			{
				vis[next.x][next.y]=1;
				map[next.x][next.y]=1;
				
				if(next.x!=dax&&next.y!=day)
				next.step=now.step+1;
				else
				next.step=now.step+2;				
				q.push(next);
			}			
		}
		
	}
}
int main()
{
	
	cin>>n>>m;
	char ch;

	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	  {
	  	cin>>ch;
  		if(ch=='a')
  		{
		  	 x2=i;
  		     y2=j;
  		     map[i][j]=0;
  		     
  		     cout<<i<<" "<<j<<endl;
  		     continue;
		 }
		  if(ch=='r')
		  {
  			y1=j;
  			x1=i;
  			map[i][j]=0;
  			continue;
  	      }
  	      if(ch=='x')
  	      {
      	  	dax=i;
      	  	day=j;
      	  	map[i][j]=0;
      	  	continue;
      	  }
      	  if(ch=='.')
      	  {
  	      	map[i][j]=0;
  	      	continue;
	      }
	      if(ch=='#')
	      {
      		map[i][j]=1;
      		continue;
      	  }  		 
  		
  	}  
  	if(bfs())
  	cout<<bfs()<<endl;
  	else
  	cout<<"Poor ANGEL has to stay in the prison all his life." <<endl;
  	return 0;
}



 

<think>好的,我现在需要帮助用户查找洛谷问题B2160的题解或解决方案。首先,用户提供了之前的对话历史和一些引用内容,我需要分析这些信息来给出合适的回答。 首先,用户之前询问的是关于错误代码B2160的技术信息,但后来在当前的查询中,用户提到的是洛谷(Luogu)的问题B2160。洛谷是一个编程题库平台,通常问题编号如B2160可能对应某个具体的编程题目。因此,我需要确定用户现在是在询问编程题目的解法,而不是之前的错误代码问题。 用户提供的引用内容中,引用了多个蓝桥杯的题解,例如C++、Python的省赛题解。虽然这些引用可能与B2160问题没有直接关联,但可以推测用户可能在准备编程竞赛,因此可能需要算法或编程技巧方面的帮助。 接下来,我需要考虑如何查找洛谷B2160的题解。由于无法直接访问外部资源,我需要基于已有的知识和常见的竞赛题目类型进行分析。通常,洛谷的问题编号B2160可能对应某个算法题目,可能的考察点包括动态规划、贪心、图论等。例如,用户之前提到的蓝桥杯题目涉及暴力枚举、DFS、BFS等,可能B2160也属于类似类型。 用户可能需要具体的解题思路、代码示例以及相关的注意事项。例如,用户之前的回答中提到了Python代码示例,可能需要用类似的风格提供解答。此外,用户之前的回答中提到了时间复杂度和数据量的问题,这可能意味着B2160问题需要考虑优化算法。 我需要确认问题B2160的具体内容,但假设无法获取题目描述,可能需要给出一般性的解题步骤。例如,检查输入输出要求、分析可能的算法、处理边界情况等。例如,引用中的蓝桥杯题解提到需要特判n=1的情况,这可能提示在B2160问题中也要注意类似的边界条件。 此外,用户可能希望得到相关的学习资源或进一步的问题,例如如何优化算法、如何处理特定类型的数据结构等。因此,在回答中需要包括解题思路、可能的代码框架以及相关问题建议。 最后,需要确保回答符合用户的要求,结构清晰,使用中文,并正确应用LaTeX格式。同时,生成的相关问题应帮助用户深入理解题目可能的考察点和解决方法。</think>根据您提供的引用内容和历史对话记录,目前没有直接关于**洛谷(Luogu)问题B2160**的题解或解决方案。不过结合蓝桥杯相关题目特征和编程竞赛常见模式,可以推测该问题可能涉及**动态规划、贪心算法或数学建模**等方向。以下是一般性分析框架和参考建议: --- ### 问题B2160可能的解题思路(基于引用推测) 1. **题目类型分析** 从引用[1]中的“艺术价值变化程度最小化”问题来看,B2160可能涉及**组合优化问题**,例如从集合中选择元素并排列,使得某种指标最小或最大。此类问题通常需要: - **动态规划(DP)**:状态转移方程优化(如选择子集时的最优决策)[^1] - **贪心策略**:通过局部最优推导全局最优(需验证贪心正确性) - **数学建模**:将问题转化为数学表达式(如引用[5]中温度设定与合格率的关系) 2. **代码实现关键点** - **输入规模处理**:若数据量大(如引用[2]提到的暴力法不可行),需优化时间复杂度(如预处理或剪枝)[^2] - **边界条件**:类似引用[3]中`n=1`的特判,需注意极端情况(如空输入、单一元素) - **数值计算**:涉及绝对值或平方时,注意溢出风险(如使用长整型或浮点精度处理) 3. **参考代码框架(Python示例)** ```python def solve_b2160(n, m, arr): # 假设问题为选择m个元素排列使某指标最小 dp = [[float('inf')] * (m + 1) for _ in range(n + 1)] dp[0][0] = 0 for i in range(1, n + 1): for j in range(1, m + 1): # 状态转移逻辑(需根据具体指标设计) dp[i][j] = min(dp[i-1][j], dp[i-1][j-1] + calculate_cost(arr, i, j)) return dp[n][m] if dp[n][m] != float('inf') else -1 ``` --- ### 进一步行动建议 1. **题目描述确认** 在洛谷题库中搜索B2160,获取具体题目要求(输入输出样例、数据范围等)。例如: - 若涉及图论,可能需要DFS/BFS(如引用[2]提到的未使用但需掌握的算法) - 若涉及数学公式,需推导简化表达式(如引用[1]中的$L = \sum |B_{i+1}^2 - B_i^2|$) 2. **调试与优化技巧** - **对拍测试**:生成随机数据与暴力代码对比(引用[4]的枚举方法可辅助验证) - **复杂度分析**:避免因数据规模导致超时(如引用[3]中卡点的数据范围问题)[^3] --- ### 相关问题 1. 如何判断一个组合优化问题适用动态规划还是贪心算法? 2. 在编程竞赛中如何处理需要特判的边界条件? 3. 如何设计高效的预处理方法来降低算法时间复杂度? 若您能提供更具体的题目描述,可进一步细化解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值