|
本帖最后由 zhangjinxuan 于 2023-2-17 19:36 编辑
上一关:组合数计算
梦想护卫舰 第23关 逃离迷宫
梦想护卫舰继续出发,可是,你们在航行中发现了不对劲
你们,被困在了一个 n 行 m 列的迷宫里面,而且迷宫每个格子的高度可能是不一的,甚至还有障碍物
也就是说,i 行 j 列的格子要么有一个高度 hi,j,要么就是障碍物,不能通过(方便起见,障碍物格子就用 0 表示)
此外,还有 k 个格子有传送门,开始时,你在 (1, 1) 的位置,你要逃离迷宫,就得到达 (n, m) 的位置
你在任意方格 (i, j) 可以执行的操作如下:
- 上下左右移动,也就是移动到 (i+1, j), (i-1, j), (i, j+1), (i, j-1) 这四个方格之一,移动时不能碰到障碍物,也不能移出边界,但不受高度影响
- 如果方格 (i, j) 有传送门,则你可以传送至另一个同样有传送门且与方格 (i,j) 高度相等的方格上;
- 将当前格子的方格改为任一正整数
进行上述每项行动均需花费 1个单位时间,现在请问你掏出迷宫的最短花费时间是多少,如果不能逃出迷宫,请输出 -1
输入格式
- n m k
- h1,1 h1,2 ... h1,m
- h2,1 h2,2 ... h2,m
- ...
- hn,1 hn,2 ... hn,m
- x1 y1
- x2 y2
- ...
- xk yk
复制代码
(xi, yi)表示第 i 个传送门的坐标
输出格式
一个整数,表示答案
输入样例1
- 4 4 2
- 1 2 3 4
- 1 2 3 4
- 1 2 3 4
- 1 2 3 4
- 1 1
- 3 4
复制代码
输出样例1
输入样例2
- 4 4 3
- 1 2 3 4
- 1 2 3 4
- 1 2 3 4
- 1 2 3 4
- 1 1
- 2 4
- 4 1
复制代码
输出样例2
输入样例3
- 2 5 0
- 1 0 3 3 4
- 2 3 4 0 5
复制代码
输出样例3
输入样例4
- 4 4 3
- 1 1 1 0
- 1 1 0 1
- 1 0 1 1
- 0 1 1 1
- 1 1
- 2 1
- 3 3
复制代码
输出样例4
输入输出样例5
见原题的附加文件
样例解释
请见原题
数据范围
注:本题非原创,选自洛谷,链接:https://www.luogu.com.cn/problem/P9065
答案与解析
[/hide]
最佳战士排行榜
| 第一名 | 第二名 | 第三名
| 名字 | myd0313 | |
| 链接 | 戳我 | |
| 语言 | C++ | |
| 代码得分 | 100 | |
| 综合得分 | 100 | |
| 奖励 | 5鱼币5荣誉+“最佳答案” | 3鱼币3荣誉+" | 2鱼币2荣誉 |
/*综合评分会参照运行时间(代码效率),代码长度,代码可读性,解题思路,代码得分等来进行评分*/
我们一起来 Hack
Hack 规则
1. Hack 经证实均有奖励,你在 Hack 时得提供完整证据、证明;
2. 在本关,仅支持标程 Hack,细节问题奖励 2~5 鱼币,重点问题奖励 5~10 鱼币
3. 奖励上限为 3 次
名字 | 等待着Hack大佬~
| Hack 类型 |
| 是否证实 |
| 链接 |
| 奖励 | |
答题/奖励规则
1. 不能抄题解,否则无奖励,可能还会扣分;
2. 当您遇到问题时,您可以回贴提问,我会为您解答
3. 提供完整能得分的题解,均有奖励。
4. 因为额度原因,部分鱼油可能下一天才能奖励。
下一关:性能测试
创作不易,如果你喜欢,别忘了评分、顶
本关满意度调查
比较简单,来写一写:
- #include<bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- int n,m,k,x,y,px,py,h[3001][3001],d1[3001][3001],d2[3001][3001],v[3001][3001],ans;
- bool c[9000001];
- int dx[4]={0,1,0,-1};
- int dy[4]={-1,0,1,0};
- int bfs(int bx,int by,int ex,int ey,int d[][3001])
- {
- int ret=INF;
- queue<pair<int,int> > q;
- d[bx][by]=0;
- for(q.push(make_pair(bx,by));!q.empty();q.pop())
- {
- x=q.front().first;
- y=q.front().second;
- if(ret==INF&&v[x][y]) ret=d[x][y];
- for(int i=0;i<4;i++)
- {
- px=x+dx[i];
- py=y+dy[i];
- if(px>0&&px<=n&&py>0&&py<=m&&h[px][py]!=0&&d[px][py]==INF)
- {
- d[px][py]=d[x][y]+1;
- q.push(make_pair(px,py));
- }
- }
- }
- return ret;
- }
- int main()
- {
- cin>>n>>m>>k;
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;j++)
- {
- scanf("%d",&h[i][j]);
- }
- }
- for(int i=1;i<=k;i++)
- {
- scanf("%d %d",&x,&y);
- v[x][y]=1;
- }
- memset(d1,0x3f3f3f3f,sizeof d1);
- memset(d2,0x3f3f3f3f,sizeof d2);
- int dis1=bfs(1,1,n,m,d1);
- int dis2=bfs(n,m,1,1,d2);
- ans=min(dis1+dis2+2,d1[n][m]);
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;j++)
- {
- if(d1[i][j]==dis1&&v[i][j]) c[h[i][j]]=1;
- }
- }
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;j++)
- {
- if(d2[i][j]==dis2&&v[i][j])
- {
- if(c[h[i][j]]) ans=min(ans,dis1+dis2+1);
- }
- }
- }
- if(ans==INF) ans=-1;
- cout<<ans<<endl;
- return 0;
- }
复制代码
|
评分
-
查看全部评分
|