[蓝桥杯 2018 国 C] 迷宫与陷阱

题目: 

思路:

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
char g[N][N];//输入:图的数组
int vis[N][N];
/*
剪枝:记录magic的个数(一个点经过两次,magic越大越好,如果第一次magic
大于第二次,则无需经过第二次*/
struct node
{
	int x,y,step,magic;
};
int n,k;
int nex[4][2]={{0,1},{0,-1},{-1,0},{1,0}};

signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	  {
	  	for(int j=1;j<=n;j++)
	  	  
	  	   cin>>g[i][j];
	  }
	  memset(vis,-1,sizeof(vis));
	  queue<node> que;
	   vis[1][1]=0;
	  que.push({ 1,1,0,0});
	 
	  
	  while(que.size())
	  {
	  	node t=que.front();
	  	 que.pop();
          if(t.x==n&&t.y==n)
          {
          	cout<<t.step;
          	return 0;
		  }
	  	 for(int i=0;i<4;i++)
	  	 {
	  	   //获取上下左右的坐标
	  	 	int tx=t.x+nex[i][0];
	  	 	int ty=t.y+nex[i][1];
	  	 	if(g[tx][ty]=='X'&&t.magic==0)
	  	 	  continue;
	  	 	int magic=max(0,t.magic-1);
	  	 	if(g[tx][ty]=='%')
	  	 	   magic=k;
	  	 	if(tx>=1&&ty>=1&&tx<=n&&ty<=n&&vis[tx][ty]<magic&&g[tx][ty]!='#')
	  	 	{
	  	 		vis[tx][ty]=magic;
	  	 		que.push({tx,ty,t.step+1,magic});
			   }
		   }
	  }
	  
	  cout<<-1;
  
  return 0;
}

模板:

char g[N][N];//输入:图的数组
int vis[N][N];//标志数组or剪枝数组
/*
剪枝:记录magic的个数(一个点经过两次,magic越大越好,如果第一次magic
大于第二次,则无需经过第二次*/
struct node//定义一个结构体
{
	int x,y,step,magic;//属性
};
//上下左右方向数组
int nex[4][2]={{0,1},{0,-1},{-1,0},{1,0}};

signed main()
{
	
	 //输入和数组初始化
	   vis[1][1]=0;
	   //定义类型为结构体的队列
	  queue<node> que;
	  //第一个元素入队(结构体要加{})
	  que.push({ 1,1,0,0});
	 
	  //循环条件队列不为空
	  while(que.size())
	  {
	  	//获取队首元素
	  	node t=que.front();
	  	 que.pop();
	  	 //终止条件(到达终点)
          if(t.x==n&&t.y==n)
          {
          	cout<<t.step;
          	return 0;
		  }
		  //枚举所有可能的坐标,并对每一个坐标不同的情形进行判断
	  	 for(int i=0;i<4;i++)
	  	 { 	   //获取上下左右的坐标
	  	 	int tx=t.x+nex[i][0];
	  	 	int ty=t.y+nex[i][1];
	  	 	
	  	 	if(g[tx][ty]=='X'&&t.magic==0)
	  	 	  continue;
	  	 	int magic=max(0,t.magic-1);
	  	 	if(g[tx][ty]=='%')
	  	 	   magic=k;
	  	 	if(tx>=1&&ty>=1&&tx<=n&&ty<=n&&vis[tx][ty]<magic&&g[tx][ty]!='#')
	  	 	{
	  	 		vis[tx][ty]=magic;
	  	 		que.push({tx,ty,t.step+1,magic});//新元素入队
			   }
		   }
	  }
	  
	  cout<<-1;
  
  return 0;
}

相关推荐

  1. 迷宫陷阱

    2024-04-11 16:36:04       19 阅读
  2. [ 2016 C] 赢球票

    2024-04-11 16:36:04       19 阅读
  3. 【算法】2013C 横向打印二叉树 题解

    2024-04-11 16:36:04       37 阅读
  4. P8655 [ 2017 B] 发现环

    2024-04-11 16:36:04       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 16:36:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 16:36:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 16:36:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 16:36:04       20 阅读

热门阅读

  1. Linux系统中安装 RPM 包

    2024-04-11 16:36:04       15 阅读
  2. 服务器的云备份和快照有哪些区别?

    2024-04-11 16:36:04       12 阅读
  3. Web | CSS选择器

    2024-04-11 16:36:04       14 阅读
  4. 头歌-机器学习 第3次实验 DBScan密度聚类方法

    2024-04-11 16:36:04       14 阅读
  5. 数据结构DAY3--栈与队列

    2024-04-11 16:36:04       15 阅读
  6. Objective-C学习笔记(@property,id,instancetype)4.9

    2024-04-11 16:36:04       14 阅读
  7. Unity 安卓将数据保存为json并读取

    2024-04-11 16:36:04       17 阅读
  8. 【代码随想录】day41

    2024-04-11 16:36:04       16 阅读
  9. 蓝桥杯day21刷题日记--接龙序列 动态规划

    2024-04-11 16:36:04       13 阅读
  10. 【Linux】 探索Linux中的cat指令:常用用法一览

    2024-04-11 16:36:04       13 阅读