编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#81732 #1038. 1-04E. zzj & liaoy 想要去摄影 Accepted 100 91 ms 14248 K C++ / 2.2 K C2024liuhongyi 2023-02-17 20:51:40
显示原始代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 35, MAXM = 1e5 + 5;
char mp[MAXN][MAXN];
int n, m, dis[MAXN][MAXN][MAXN][MAXN];
int dx[5] = { 0, 1, 0, -1 }, dy[5] = { 1, 0, -1, 0 };
struct node {
    int xx, yy;
    node() {}
    node(int xxx, int yyy) {
        xx = xxx;
        yy = yyy;
    }
};
void bfs(int x, int y) {
    queue<node> q;
    q.push(node(x, y));
    memset(dis[x][y], 0x3f, sizeof(dis[x][y]));
    dis[x][y][x][y] = 0;
    while (!q.empty()) {
        int xx = q.front().xx, yy = q.front().yy;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int xxx = xx + dx[i], yyy = yy + dy[i];
            if (xxx > n || yyy > m || xxx < 1 || yyy < 1 || mp[xxx][yyy] == '#')
                continue;
            if (dis[x][y][xxx][yyy] > dis[x][y][xx][yy] + 1) {
                dis[x][y][xxx][yyy] = dis[x][y][xx][yy] + 1;
                q.push(node(xxx, yyy));
            }
        }
    }
}
int cnt, X[MAXN], Y[MAXN];
int dp[MAXM][MAXN];
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> mp[i][j];
            if (mp[i][j] == 'p')
                X[0] = i, Y[0] = j;
            if (mp[i][j] == '@')
                X[++cnt] = i, Y[cnt] = j;
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (mp[i][j] == 'p' || mp[i][j] == '@')
                bfs(i, j);
        }
    }
    memset(dp, 0x3f, sizeof(dp));
    dp[0][0] = 0;
    for (int i = 0; i < cnt; i++) dp[1 << i][i + 1] = dis[X[0]][Y[0]][X[i + 1]][Y[i + 1]];
    for (int i = 1; i < (1 << cnt); i++) {
        for (int j = 0; j < cnt; j++) {
            if (!(i & (1 << j)))
                continue;
            for (int k = 0; k < cnt; k++) {
                int tmp = (1 << k);
                if (i & tmp)
                    continue;
                dp[i | tmp][k + 1] =
                    min(dp[i | tmp][k + 1], dp[i][j + 1] + dis[X[j + 1]][Y[j + 1]][X[k + 1]][Y[k + 1]]);
            }
        }
    }
    int ans = 0x3f3f3f3f;
    for (int i = 1; i <= cnt; i++) ans = min(ans, dp[(1 << cnt) - 1][i]);
    if (ans == 0x3f3f3f3f)
        puts("-1");
    else
        printf("%lld", ans);
    return 0;
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:5 ms
内存:13952 KiB

输入文件(1.in

3 3
p@#
#..
..@

答案文件(1.out

4

用户输出

4

系统信息

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

输入文件(2.in

3 3
p##
@#@
###

答案文件(2.out

-1

用户输出

-1

系统信息

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

输入文件(3.in

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

答案文件(3.out

-1

用户输出

-1

系统信息

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

输入文件(4.in

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

答案文件(4.out

12

用户输出

12

系统信息

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

输入文件(5.in

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

答案文件(5.out

-1

用户输出

-1

系统信息

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

输入文件(6.in

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

答案文件(6.out

-1

用户输出

-1

系统信息

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

输入文件(7.in

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

答案文件(7.out

30

用户输出

30

系统信息

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

输入文件(8.in

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

答案文件(8.out

61

用户输出

61

系统信息

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

输入文件(9.in

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

答案文件(9.out

12

用户输出

12

系统信息

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

输入文件(10.in

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

答案文件(10.out

83

用户输出

83

系统信息

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

输入文件(11.in

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

答案文件(11.out

130

用户输出

130

系统信息

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

输入文件(12.in

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

答案文件(12.out

154

用户输出

154

系统信息

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

输入文件(13.in

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

答案文件(13.out

114

用户输出

114

系统信息

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

输入文件(14.in

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

答案文件(14.out

-1

用户输出

-1

系统信息

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

输入文件(15.in

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

答案文件(15.out

11

用户输出

11

系统信息

Exited with return code 0