题目链接
题目:
佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?

已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费 1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?
输入格式

输入的第一行包含三个整数:M,N,T。代表 M 行 N 列的地图和鸣人初始的查克拉数量 T。0<M,N<200,0≤T<10
后面是 M 行 N 列的地图,其中 @ 代表鸣人,+ 代表佐助。* 代表通路,# 代表大蛇丸的手下。

输出格式

输出包含一个整数 R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出 −1。

Sample Input

4 4 1
#@##
**##
###+
*
***

Sample Output

6

Sample Input 2

4 4 2
#@##
**##
###+
*
***

Sample Output 2

4

这是一道广度优先搜索题,与传统的bfs题相比这个题多了一个查克拉数字,原本认为只需要在结构体里多声明一个变量就可以了,但是发现这样并不能解题。
如果从不同点出发到达同一点,而他们两次到达时所携带的查克拉数不同,就会出现第二次无法到达该点的情况,但因为走的路不同携带的查克拉数不同,那么这到达目的地的步数也会不同。
这里我们用三维数组解决这个问题,三维数组,前两维是横纵坐标,第三维是查克拉数这样通过同一点时携带的查克拉数字不同也能将点加入队列。

代码如下:

#include<iostream>
using namespace std;
struct muban
{int x;int y;int step;//记录走的步数 int num;//记录查克拉数
}que[50000];
char imap[205][205];
int book[205][205][15];//三维数组,第三个维度记录查克拉数
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{int n,m,t;cin>>n>>m>>t;int stax,stay,endx,endy;//记录起始点终止点横纵坐标 for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>imap[i][j];if(imap[i][j]=='@'){stax=i;stay=j;}if(imap[i][j]=='+'){endx=i;endy=j;imap[i][j]='*';}}}int head,tail,tx,ty;head=1;que[head].x=stax;que[head].y=stay;que[head].step=0;que[head].num=t;book[stax][stay][t]=1;tail=2;int minstep=99999;while(head<tail){for(int i=0;i<4;i++){tx=que[head].x+next[i][0];ty=que[head].y+next[i][1];if(tx>=0&&tx<n&&ty>=0&&ty<m){if(imap[tx][ty]=='*'&&book[tx][ty][que[head].num]==0) {//cout<<tx<<","<<ty<<","<<que[head].step+1<<endl;book[tx][ty][que[head].num]=1;que[tail].x=tx;que[tail].y=ty;que[tail].step=que[head].step+1;que[tail].num=que[head].num;tail++;}else if(imap[tx][ty]=='#'&&que[head].num>=1&&book[tx][ty][que[head].num-1]==0)//如果该点有大蛇丸的手下并且携带的查克拉数大于1 {//cout<<tx<<","<<ty<<","<<que[head].step+1<<endl;book[tx][ty][que[head].num-1]=1;que[tail].x=tx;que[tail].y=ty;que[tail].step=que[head].step+1;que[tail].num=que[head].num-1;//查克拉数减一 tail++;}}if(que[tail-1].x==endx&&que[tail-1].y==endy){if(que[tail-1].step<minstep)minstep=que[tail-1].step;}}head++;}if(minstep==99999)cout<<"-1"<<endl;elsecout<<minstep<<endl;return 0;
}

用队列queue解题代码:

#include<bits/stdc++.h>
using namespace std;
struct muban
{int x;int y;int step;int num;
};
char a[202][202];
int book[202][202][11];
int n,m,t,stax,stay,endx,endy;
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main()
{cin>>n>>m>>t;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='@'){stax=i;stay=j;}else if(a[i][j]=='+'){endx=i;endy=j;a[i][j]='*';}}}queue<muban> q;struct muban e,u;e.x=stax;e.y=stay;e.num=t;e.step=0;q.push(e);int min=99999;while(q.size()){e=q.front();q.pop();for(int i=0;i<4;i++){u.x=e.x+next[i][0];u.y=e.y+next[i][1];if(u.x>=0&&u.x<n&&u.y>=0&&u.y<m){if(a[u.x][u.y]=='*'&&book[u.x][u.y][e.num]==0){book[u.x][u.y][e.num]=1;//cout<<u.x<<" "<<u.y<<" "<<u.step<<endl;u.step=e.step+1;u.num=e.num;q.push(u);}else if(a[u.x][u.y]=='#'&&e.num>=1&&book[u.x][u.y][e.num-1]==0){book[u.x][u.y][e.num-1]=1;u.step=e.step+1;u.num=e.num-1;q.push(u);}}if(q.back().x==endx&&q.back().y==endy){if(q.back().step<min){min=q.back().step;cout<<min<<endl;return 0;}}}}cout<<-1<<endl;return 0;
}
中间出现编译报错[Error] ld returned 1 exit status,原因是我没有把之前打开的终端关闭,我一开始还以为是我编译错误…
在网上查了出现此类报错还可能的错误里面还有
1、事先声明的函数与实现(implementation)的函数名不相同
2、在c++类中定义了static 数据类型没有初始化
还有我前几次提交都报错Memory Limit Exceeded,是因为我标记book事把=号打成==了。

鸣人和佐助 计蒜客--1214 广搜 三维数组相关推荐

  1. OpenJ_Bailian——4115鸣人和佐助(带状态的A*)

    鸣人和佐助 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Desc ...

  2. Bailian4115 鸣人和佐助【BFS】

    4115:鸣人和佐助 总时间限制: 1000ms 内存限制: 65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上 ...

  3. 第9周测验-鸣人和佐助

    021:鸣人和佐助 1. 题目详情 描述 输入 输出 样例输入 样例输出 2.思路分析 2.1 整体思路 2.2 限制条件处理 2.3 剪枝 3.注意点 4.AC代码 5.总结 1. 题目详情 描述 ...

  4. O - 鸣人和佐助(BFS)

    O - 鸣人和佐助 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要 ...

  5. OpenJudge-021:鸣人和佐助

    OpenJudge-021:鸣人和佐助 题目描述: 题目传送门:添加链接描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要 ...

  6. 计蒜客题解——T1214:鸣人和佐助

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...

  7. 计蒜客 鸣人和佐助 bfs

    佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这 ...

  8. T1214 鸣人和佐助——dfs、bfs

    佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 分析 bfs 迷宫问题,求最短时间,和 拯救行动 差不多,存在打怪兽可以通过的另外条件:但是此题打怪兽不需要另耗时间,所以第一次找到的终点就是最短时 ...

  9. NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解

    总时间限制: 1000ms 内存限制: 65536kB 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到, ...

最新文章

  1. Swift 3.0 预告:将 Objc 库转换成更符合 Swift 语法风格的形式
  2. CSW:闪电网络是一种证券,BCH避开了它
  3. 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning
  4. 全国英语等级考试网上报名
  5. 英语学习框架(一) 英语音标
  6. 我国标准时间授时方法
  7. 用cdr怎么精确裁剪图形
  8. 下载bilibili视频
  9. 微信小程序(手机号正则表达式如何验证)手机号格式验证
  10. windows DoraOS 双系统云终端安装
  11. Distiller 安装时环境配置的一些可选项
  12. oracle 手工创建数据库
  13. 搭建一个网站的成本?
  14. 用Python代码来下载任意指定网易云歌曲(超详细版)
  15. python模拟鼠标键盘点击,简单自动化动物餐厅
  16. 信息学奥赛初赛题目讲解(2)
  17. 利用h5营销活动技巧
  18. Qt编写的软件(2019/12/11)
  19. 老板电器:坏账与乌龙齐飞,主业难保新增长
  20. linux定时备份网站发布目录,Linux 定时备份网站文件至七牛云存储 | 厘米天空

热门文章

  1. Java 位运算详解
  2. Ai机器人可以入国籍、可以当主播,当然也可以当电销精英
  3. 洛谷:P6062 [USACO05JAN]Muddy Fields G
  4. 文件储存树的理解(ISAM 和 B+Tree)
  5. 信息收集、美杜莎简介-9.26
  6. smtp java 抓包_[Wireshark]_003_电子邮件抓包分析
  7. qpOASES使用笔记
  8. 使用IDEA搭建一个简单的SpringBoot项目——详细过程
  9. SpringMVC-Spring-Mybatis
  10. 给openWrt安装管理界面中文包,顺带安装新界面风格,亲测有效