编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#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);
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:2 ms
内存:400 KiB

输入文件(1.in

3 3
p@#
#..
..@

答案文件(1.out

4

用户输出

4

系统信息

Exited with return code 0
测试点 #2
Accepted
得分:100
用时:2 ms
内存:372 KiB

输入文件(2.in

3 3
p##
@#@
###

答案文件(2.out

-1

用户输出

-1

系统信息

Exited with return code 0
测试点 #3
Accepted
得分:100
用时:3 ms
内存:352 KiB

输入文件(3.in

5 5
...@.
#####
###.@
#@p#@
..#.#

答案文件(3.out

-1

用户输出

-1

系统信息

Exited with return code 0
测试点 #4
Accepted
得分:100
用时:3 ms
内存:356 KiB

输入文件(4.in

5 5
.@.@#
#.p..
...##
.@..@
##@#.

答案文件(4.out

12

用户输出

12

系统信息

Exited with return code 0
测试点 #5
Accepted
得分:100
用时:2 ms
内存:364 KiB

输入文件(5.in

10 10
#.########
####.###@#
##########
######.###
@.#.#p#@##
###..##.##
##.#####.#
#.####@#.#
###@##
<15 bytes omitted>

答案文件(5.out

-1

用户输出

-1

系统信息

Exited with return code 0
测试点 #6
Accepted
得分:100
用时:2 ms
内存:384 KiB

输入文件(6.in

10 10
.##.@.#.#.
###..##@#.
...#@#.###
.#.#..#...
#..#.....#
....##..##
..##..@.#p
##....##..
..#...
<15 bytes omitted>

答案文件(6.out

-1

用户输出

-1

系统信息

Exited with return code 0
测试点 #7
Accepted
得分:100
用时:3 ms
内存:412 KiB

输入文件(7.in

10 10
.#@......#
...#......
..#.....##
..#..#....
...##..@.@
...@#.#...
#.#..#..#.
.p......##
.#..#.
<15 bytes omitted>

答案文件(7.out

30

用户输出

30

系统信息

Exited with return code 0
测试点 #8
Accepted
得分:100
用时:2 ms
内存:416 KiB

输入文件(8.in

20 20
..##.......@........
..#...#....#..##....
...#.#...#..#.#..#..
..#...#..#@###..##..
..#.#....#
<325 bytes omitted>

答案文件(8.out

61

用户输出

61

系统信息

Exited with return code 0
测试点 #9
Accepted
得分:100
用时:3 ms
内存:360 KiB

输入文件(9.in

30 30
##..##.###........#...#...@##.
#.#..#...##.....#.#.#..##p.#.@
...#.##......#...#.#.....#..#@
#
<835 bytes omitted>

答案文件(9.out

12

用户输出

12

系统信息

Exited with return code 0
测试点 #10
Accepted
得分:100
用时:3 ms
内存:388 KiB

输入文件(10.in

30 30
.....#..#...#.@..#..##.#..#...
.#..##.....##..........#.....#
##...##...#.#.......p...#...#.
#
<835 bytes omitted>

答案文件(10.out

83

用户输出

83

系统信息

Exited with return code 0
测试点 #11
Accepted
得分:100
用时:52 ms
内存:488 KiB

输入文件(11.in

30 30
##.....#.......#.....##...#@..
.......#.##.##..#.#.####.##...
.##......#..#.#.......#.....#.
.
<835 bytes omitted>

答案文件(11.out

130

用户输出

130

系统信息

Exited with return code 0
测试点 #12
Accepted
得分:100
用时:54 ms
内存:476 KiB

输入文件(12.in

30 30
...#..###.....##.#....#...##..
#.#...#..#.#..#..#.######..##.
.##..#.@.#......##...#....#.#.
.
<835 bytes omitted>

答案文件(12.out

154

用户输出

154

系统信息

Exited with return code 0
测试点 #13
Accepted
得分:100
用时:56 ms
内存:392 KiB

输入文件(13.in

30 30
..#...#...#...#........#....##
#.##....##.@#.#.#.#.#..@......
#.....#..@....#..#..##.#..#..#
.
<835 bytes omitted>

答案文件(13.out

114

用户输出

114

系统信息

Exited with return code 0
测试点 #14
Accepted
得分:100
用时:48 ms
内存:436 KiB

输入文件(14.in

30 30
#.######.##.####.#######.#####
##.@####.######.#########.##.#
...######.########.########.##
#
<835 bytes omitted>

答案文件(14.out

-1

用户输出

-1

系统信息

Exited with return code 0
测试点 #15
Accepted
得分:100
用时:7 ms
内存:352 KiB

输入文件(15.in

30 30
########.###.###.###.###.##.##
######.####..#.###.###########
########.####.#########.######
.
<835 bytes omitted>

答案文件(15.out

11

用户输出

11

系统信息

Exited with return code 0