用户输出
4
系统信息
Exited with return code 0
编号 | 题目 | 状态 | 分数 | 总时间 | 内存 | 代码 / 答案文件 | 提交者 | 提交时间 |
---|---|---|---|---|---|---|---|---|
#21524 | #1038. 1-04E. zzj & liaoy 想要去摄影 | Accepted | 100 | 242 ms | 488 K | C++ 17 / 2.5 K | Leohh | 2020-02-08 0:24:21 |
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#define MAX_N 35
#define MAX_P 905
#define MAX_I 15
#define INF 0x3f3f3f3f
#define pii pair<int, int>
#define int long long
using namespace std;
int n, m, tot = 0, ans = INF;
int a[MAX_I];
int id[MAX_N][MAX_N];
int dis[MAX_I][MAX_P];
char s[MAX_N][MAX_N];
bool vis[MAX_P];
vector<int> e[MAX_P];
vector<pii> v;
void add(int a, int b, int c, int d) {
int x = id[a][b], y = id[c][d];
if (s[a][b] != '#' && s[c][d] != '#') {
e[x].push_back(y);
e[y].push_back(x);
}
}
void dij(int s, int *dis) {
priority_queue<pii, vector<pii>, greater<pii> > q;
for (int i = 1; i <= tot; i++) {
dis[i] = INF;
vis[i] = false;
}
dis[s] = 0;
q.push(pii(0, s));
while (!q.empty()) {
int x = q.top().second;
q.pop();
if (vis[x]) {
continue;
}
vis[x] = true;
for (int i = 0; i < e[x].size(); i++) {
int t = e[x][i];
if (dis[x] + 1 < dis[t]) {
dis[t] = dis[x] + 1;
q.push(pii(dis[t], t));
}
}
}
}
signed main() {
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", s[i] + 1);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s[i][j] != '#') {
id[i][j] = ++tot;
}
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
add(i, j, i + 1, j);
add(i, j, i, j + 1);
}
}
for (int i = 1; i < n; i++) {
add(i, m, i + 1, m);
}
for (int i = 1; i < m; i++) {
add(n, i, n, i + 1);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s[i][j] == '@') {
v.push_back(pii(i, j));
} else if (s[i][j] == 'p') {
v.insert(v.begin(), pii(i, j));
}
}
}
for (int i = 0; i < v.size(); i++) {
dij(id[v[i].first][v[i].second], dis[i]);
a[i] = i;
}
int len = v.size();
do {
int s = dis[0][id[v[a[1]].first][v[a[1]].second]];
for (int i = 2; i < len; i++) {
s += dis[a[i - 1]][id[v[a[i]].first][v[a[i]].second]];
}
ans = min(ans, s);
} while (next_permutation(a + 1, a + len));
printf("%lld\n", ans < INF ? ans : -1);
}
10 10
#.########
####.###@#
##########
######.###
@.#.#p#@##
###..##.##
##.#####.#
#.####@#.#
###@##
<15 bytes omitted>
用户输出
-1
系统信息
Exited with return code 0
10 10
.##.@.#.#.
###..##@#.
...#@#.###
.#.#..#...
#..#.....#
....##..##
..##..@.#p
##....##..
..#...
<15 bytes omitted>
用户输出
-1
系统信息
Exited with return code 0
10 10
.#@......#
...#......
..#.....##
..#..#....
...##..@.@
...@#.#...
#.#..#..#.
.p......##
.#..#.
<15 bytes omitted>
用户输出
30
系统信息
Exited with return code 0
20 20
..##.......@........
..#...#....#..##....
...#.#...#..#.#..#..
..#...#..#@###..##..
..#.#....#
<325 bytes omitted>
用户输出
61
系统信息
Exited with return code 0
30 30
##..##.###........#...#...@##.
#.#..#...##.....#.#.#..##p.#.@
...#.##......#...#.#.....#..#@
#
<835 bytes omitted>
用户输出
12
系统信息
Exited with return code 0
30 30
.....#..#...#.@..#..##.#..#...
.#..##.....##..........#.....#
##...##...#.#.......p...#...#.
#
<835 bytes omitted>
用户输出
83
系统信息
Exited with return code 0
30 30
##.....#.......#.....##...#@..
.......#.##.##..#.#.####.##...
.##......#..#.#.......#.....#.
.
<835 bytes omitted>
用户输出
130
系统信息
Exited with return code 0
30 30
...#..###.....##.#....#...##..
#.#...#..#.#..#..#.######..##.
.##..#.@.#......##...#....#.#.
.
<835 bytes omitted>
用户输出
154
系统信息
Exited with return code 0
30 30
..#...#...#...#........#....##
#.##....##.@#.#.#.#.#..@......
#.....#..@....#..#..##.#..#..#
.
<835 bytes omitted>
用户输出
114
系统信息
Exited with return code 0
30 30
#.######.##.####.#######.#####
##.@####.######.#########.##.#
...######.########.########.##
#
<835 bytes omitted>
用户输出
-1
系统信息
Exited with return code 0