lanqiao OJ 229 迷宫与陷阱

简介: lanqiao OJ 229 迷宫与陷阱

1.迷宫与陷阱 - 蓝桥云课 (lanqiao.cn)

这道题是真有意思,感觉有点难度,这个不能用简单的二维数组v判重,要用三维v判重,

v[i][j][k] 走到 i 行 j 列的且无敌状态还有 k步  的 时候是否以前有过这种情况;

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
 
using namespace std ;
const int N = 1100 ;
int n ,k ;
char mp[N][N] ;
int v[N][N][20] ;//这是这道题的关键,v[i][j][k] 走到 i 行 j 列的且无敌状态还有 k步  的 时候是否以前有过这种情况;
int d[4][2] = {{0,1},{0,-1},{1,0},{-1,0}} ;
struct node{//记录位置,还可以无敌的步数q,和已经走过的距离u
  int x, y ,q , u ;
  node(int xx, int yy ,int qq , int uu){
    x = xx , y = yy , q = qq, u = uu ;
  }
};
int ans  ;
queue<node> q ; 
bool bfs(){
  q.push(node(0,0,0,0)) ;
  while(!q.empty()){
    node now = q.front() ;
    q.pop() ;
    int x = now.x , y = now.y ;
    if(x == n - 1 && y == n - 1){
      ans = now.u ; return  1 ;
    }
    for(int i = 0 ; i < 4 ; i ++){
      int tx = x + d[i][0] , ty = y + d[i][1] ;
      if(tx<0||tx>=n||ty<0||ty>=n||mp[tx][ty] == '#') continue ;
      if(v[tx][ty][now.q]) continue ;
            //下一步一共有4情况:
            //1.下一步是X,但是无敌状态q==0
            //2.下一步是 . ,怎么样都能走
            //3.下一步是% ,走过去,并且把下一步的 无敌状态q变成k
            //4.下一步是X,并且处于无敌状态
      if(mp[tx][ty] == 'X' && now.q == 0) continue ;
      if(mp[tx][ty] == '.'){
        v[tx][ty][now.q] = 1 ;
        int w = now.q ; 
        if(w) w -- ;
        else  w = 0 ;
        q.push(node(tx,ty,w,now.u+1)) ;
      }
      if(mp[tx][ty] == '%'){
        int w = k ;
        v[tx][ty][now.q] = 1 ;
        q.push(node(tx,ty,w,now.u+1));
      }
      if(mp[tx][ty] == 'X' && now.q){
        v[tx][ty][now.q] = 1 ;
        q.push(node(tx,ty,now.q-1,now.u+1)) ;
      }
    }
  }
  return 0 ;
}
 
int  main(){
  cin >> n >> k ; 
  for(int i = 0 ; i < n ; i++) cin >> mp[i] ;
  v[0][0][0] = 1 ;
  if(bfs()) cout << ans << endl ;
  else cout << -1 << endl ;
  return 0 ;
}
目录
相关文章
|
5月前
递推7-2 sdut-C语言实验-养兔子分数
递推7-2 sdut-C语言实验-养兔子分数
24 0
|
2月前
lanqiao OJ 108 发现环
lanqiao OJ 108 发现环
16 1
|
6月前
|
数据安全/隐私保护
【洛谷 P1928】外星密码 题解(递归+字符串)
外星密码挑战涉及解压缩由重复子串压缩的字符串,如`[3FUN]`代表`FUNFUNFUN`。输入是一行压缩过的字符串,输出是解压缩的结果。代码使用递归方法,遇到`[`读取重复次数并解压下一层,遇到`]`返回当前层结果,否则直接添加字符。样例输入`AC[3FUN]`输出`ACFUNFUNFUN`。处理的数据限制为解压后长度在20000内,最多十重压缩。
99 0
|
2月前
lanqiao OJ 641 迷宫
lanqiao OJ 641 迷宫
34 0
|
2月前
lanqiao OJ 234 大胖子走迷宫
lanqiao OJ 234 大胖子走迷宫
11 0
|
2月前
lanqiao OJ 网络寻路
lanqiao OJ 网络寻路
31 0
|
6月前
|
机器学习/深度学习 移动开发 人工智能
C语言程序设计例题
C语言程序设计50例
|
5月前
递推 4----7-4 sdut-C语言实验-马拦过河卒
递推 4----7-4 sdut-C语言实验-马拦过河卒
54 0
|
6月前
|
人工智能 算法 BI
【洛谷 P1803】凌乱的yyy _ 线段覆盖 题解(贪心算法+结构体排序)
**线段覆盖问题**: YYY 想在 NOIP 前参加最多比赛。给定 $n$ 场比赛的开始和结束时间,每场比赛必须连续且不能冲突。输入包含每场比赛的时间段,输出最多可参加的比赛数。$20\%$ 数据 $n\leq10$,$50\%$ 数据 $n\leq10^3$,$100\%$ 数据 $n\leq10^6$。解决方案:按结束时间排序比赛,若当前比赛开始时间晚于上一个结束时间,则计数加一。样例输入:3 场比赛,输出:2。AC C++ 代码实现了此算法。
42 0
|
6月前
|
存储 物联网
【洛谷 P1135】奇怪的电梯 题解(广度优先搜索)
这是一个关于奇怪电梯的编程问题摘要: - 电梯在每层停,且每层有特定数字 $K_i$ 决定上/下按钮的功能。 - 目标是从 $A$ 楼到 $B$ 楼,求最少按键次数,若无法到达则输出 `-1`。 - 输入包括 $N$(楼层数)、$A$(起点)和 $B$(终点),以及每层的 $K_i$ 数字。 - 使用广度优先搜索(BFS)解决,通过队列存储访问过的楼层,避免重复并计算步数。 - 当到达目标楼层时返回步数,队列空时返回 `-1`。
51 0