百炼 4130: Saving Tang Monk

news/2024/11/2 0:33:16/

同一个S可能需要多次经过,只需杀一次。

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;const int N = 100 + 5;char s[N][N];
int si, sj, n, m, ei, ej, p[N][N];struct Node {int x, y, key, dis, snack;Node(int x = 0, int y = 0, int key = 0, int dis = 0, int snack = 0) :x(x), y(y), key(key), dis(dis), snack(snack) {}bool operator<(const Node& n)const {return dis > n.dis;}
};int dir[][4] = { {-1,1,0,0},{0,0,-1,1} };
int d[N][N][10];int bfs() {priority_queue<Node> q;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)for (int k = 0; k <= m; k++)d[i][j][k] = 0x3f3f3f3f;q.push(Node(si, sj, 0, 0, 0));d[si][sj][0] = 0;while (!q.empty()) {Node tp = q.top();q.pop();for (int i = 0; i < 4; i++) {int ii = tp.x + dir[0][i];int jj = tp.y + dir[1][i];if (0 <= ii && ii < n && 0 <= jj && jj < n && s[ii][jj] != '#') {if (s[ii][jj] == 'S') {if ((tp.snack >> p[ii][jj]) & 1){if (tp.dis + 1 < d[ii][jj][tp.key])d[ii][jj][tp.key] = tp.dis + 1, q.push(Node(ii, jj, tp.key, tp.dis + 1, tp.snack));}else {if (tp.dis + 2 < d[ii][jj][tp.key])d[ii][jj][tp.key] = tp.dis + 2, q.push(Node(ii, jj, tp.key, tp.dis + 2, tp.snack | (1 << p[ii][jj])));}}else if ('1' <= s[ii][jj] && s[ii][jj] <= '9') {if (s[ii][jj] - '0' == tp.key + 1) {if (tp.dis + 1 < d[ii][jj][tp.key + 1]) {d[ii][jj][tp.key + 1] = tp.dis + 1, q.push(Node(ii, jj, tp.key + 1, tp.dis + 1, tp.snack));}}else {if (tp.dis + 1 < d[ii][jj][tp.key])d[ii][jj][tp.key] = tp.dis + 1, q.push(Node(ii, jj, tp.key, tp.dis + 1, tp.snack));}}else if (s[ii][jj] == 'T') {if (tp.key == m)return tp.dis + 1;else{if (tp.dis + 1 < d[ii][jj][tp.key])d[ii][jj][tp.key] = tp.dis + 1, q.push(Node(ii, jj, tp.key, tp.dis + 1, tp.snack));}}else {if (tp.dis + 1 < d[ii][jj][tp.key])d[ii][jj][tp.key] = tp.dis + 1, q.push(Node(ii, jj, tp.key, tp.dis + 1, tp.snack));}}}}return -1;
}int main(){for (; scanf("%d%d", &n, &m) == 2 && n + m;) {si = -1, sj = -1, ei = -1, ej = -1;for (int i = 0; i < n; i++)scanf("%s", s[i]);int cnt = 0;for(int i=0;i<n;i++)for (int j = 0; j < n; j++){if (s[i][j] == 'K')si = i, sj = j;else if (s[i][j] == 'T')ei = i, ej = j;else if (s[i][j] == 'S') p[i][j] = cnt++;}if (ei == -1 || si == -1) {printf("impossible\n");}else {int ans = bfs();if (ans != -1) printf("%d\n", ans);else printf("impossible\n");}}return 0;
}

http://www.ppmy.cn/news/221959.html

相关文章

【JZOJ1214】【洛谷P4130】项链工厂【线段树】

题目大意&#xff1a; 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P4130 一条项链包含 N 个珠子&#xff0c;每个珠子的颜色是 1&#xff0c;2&#xff0c;…&#xff0c;c 中的一种。项链 被固定在一个平板上&#xff0c;平板的某个位置被标记位置 1 &…

百炼4116 拯救行动4130 Saving Tang Monk4115 鸣人与佐助 简单BFS搜索题型总结对比

一、 百炼4116拯救行动&#xff08;OpenJudge - 4116:拯救行动&#xff09; 这题就是在简单BFS的基础上加了一个守卫&#xff0c;击杀一次守卫时间也需要1&#xff0c;其他照常按照普通BFS的思路就行&#xff0c;最主要就是可以把击杀守卫看成是经过两次这一个点&#xff0c;这…

BZOJ4130:[PA2011]Kangaroos

浅谈\(K-D\ Tree\)&#xff1a;https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门&#xff1a;https://lydsy.com/JudgeOnline/problem.php?id4130 这题跟\(BZOJ4358:permu\)一样。 不过我们需要把区间包含某个点改成判断区间是否有交点。 假设我们有俩区间\([l,r]\)…

百练4130:Saving Tang Monk

英文题目巨烦 紧接着百练4115:鸣人和佐助和百练4116拯救行动的变形 题目连接&#xff1a;http://bailian.openjudge.cn/practice/4130/ #include<iostream> #include<algorithm> #include<fstream> #include<cstdlib> #include<cstring> #inc…

Gigabayte-Z87-DS3H i3 4130电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Gigabayte-Z87-DS3H 处理器英特尔酷睿i3 4130 Haswell已驱动 内存4x4GB DDR3/1600Mhz金士顿已驱动 硬盘SSD 480GB PNY CS900已驱动 显卡英特尔高…

[jzoj 1214] [luogu 4130] [NOI2007]项链工厂 {线段树}

题目 https://www.luogu.org/problemnew/show/P4130 解题思路 S p l a y 不 会 \color{red}Splay不会 Splay不会&#xff0c;那就正经的打线段树。 这道题目的后4问&#xff0c;就是纯正的线段树。 对于前两问&#xff0c;其实只是改变了每一个端点的位置&#xff0c;但没有改…

二分查找 ZOJ4130

ZOJ4130 题目链接在此&#xff01; 题目大意&#xff1a; 关灯问题。 总共n个灯&#xff0c;然后给状态&#xff0c;一次能关掉连续的m个灯。 关灯k次就能成功&#xff0c;问最少的m。 注意&#xff01;不是改变状态&#xff01;是关掉&#xff01;0不会重新变成1的。 题目…

zoj 4130(The 16th Zhejiang Provincial Collegiate Programming Contest D)(思维)

传送门&#xff1a; 题意&#xff1a; 你现在有nnn个点&#xff0c;对于第iii个点&#xff0c;可以到达第i−1i-1i−1、2∗i2*i2∗i、2∗(i1)2*(i1)2∗(i1)、⌊i2⌋\left \lfloor \frac{i}{2} \right \rfloor⌊2i​⌋号点。现在问你从111号点开始的哈密顿路径。 分析&#xff1…