题目:0迷宫与陷阱 - 蓝桥云课 (lanqiao.cn)
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;int n,k;//N*N矩阵大小,k无敌状态持续的步数
char map[1010][1010];//迷宫
int vis[1010][1010];//标记矩阵//上下左右四个方向
const int dr[]={-1,1,0,0};
const int dc[]={0,0,-1,1}; typedef struct node{int x,y,dis,res_k;//x,y记录位置,dis记录走的步数,res_k代表剩余无敌步数//构造函数 node(int x,int y,int dis,int res_k=0):x(x),y(y),dis(dis),res_k(res_k){}
}node;//判断是否还在迷宫内
bool isInside(int nx,int ny)
{if(nx>=0&&nx<n&&ny>=0&&ny<n)return true;return false;
}
int bfs()
{//创建队列,初始化队列 queue<node> q;//队列node u(0,0,0,0);q.push(u);//初始化标记矩阵vis[0][0]=1;//标记当前位置已访问while(!q.empty()){node v=q.front();q.pop();//如果到达终点,结束 if(v.x==n-1&&v.y==n-1){return v.dis;} //往上下左右走 for (int i = 0; i < 4; i++){int nx=v.x+dr[i];int ny=v.y+dc[i];//跳过迷宫外 if (!isInside(nx,ny))continue;//跳过墙 if (map[nx][ny] == '#')continue;//跳过普通且陷阱 if (v.res_k==0 && map[nx][ny] == 'X')continue;//跳过普通且已经访问 if (v.res_k == 0 && vis[nx][ny])continue;// int k1 = v.res_k;k1 = max(k1 - 1, 0);//碰见道具 if (map[nx][ny] == '%'){k1 = k;map[nx][ny]='.';//下次失效 }vis[nx][ny] = 1;q.push(node(nx, ny, v.dis + 1, k1));}}return -1; }
int main()
{cin>>n>>k;for(int i=0;i<n;i++)cin>>map[i];cout<<bfs();}