Submission details
Task:Mission
Sender:OOliOO_slayer
Submission time:2015-10-07 18:13:02 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.05 sdetails
#2ACCEPTED0.06 sdetails
#3ACCEPTED0.06 sdetails
#4ACCEPTED0.06 sdetails
#5ACCEPTED0.05 sdetails
#6ACCEPTED0.05 sdetails
#7ACCEPTED0.06 sdetails
#8ACCEPTED0.05 sdetails
#9ACCEPTED0.05 sdetails
#10ACCEPTED0.06 sdetails
#11ACCEPTED0.05 sdetails
#12ACCEPTED0.05 sdetails
#13ACCEPTED0.06 sdetails
#14ACCEPTED0.06 sdetails
#15ACCEPTED0.05 sdetails
#16ACCEPTED0.06 sdetails
#17ACCEPTED0.05 sdetails
#18ACCEPTED0.06 sdetails
#19ACCEPTED0.05 sdetails
#20ACCEPTED0.05 sdetails
#21ACCEPTED0.06 sdetails
#22ACCEPTED0.06 sdetails
#23ACCEPTED0.05 sdetails
#24ACCEPTED0.05 sdetails
#25ACCEPTED0.06 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:77:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < line.size(); j++){
                          ^

Code

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <utility>
#include <set>
#include <deque>

typedef long long LL;

using namespace std;
LL n,m,k;

class Node{
  
public:
    int r,c,dist;
    Node(int r, int c, int dist){
        this->r = r;
        this->c = c;
        this->dist = dist;
    }
};

bool free(int r, int c, vector<vector<char> >& grid){
    return grid[r][c] != '#';
}

void bfs(int r, int c, int start, vector<vector<char> >& grid, vector<vector<int> >& D){
    
    deque<Node> Q;
    vector<vector<char> > visited(n, vector<char>(m));
    Q.push_back(Node(r,c,0));
    while(!Q.empty()){
        auto v = Q.front(); Q.pop_front();
        r = v.r; 
        c = v.c;
        if(visited[r][c]) continue;
        visited.at(r).at(c) = 1;
        
        char symbol = grid[r][c];
        if(symbol >= '0' && symbol <= '9'){
            D[start][symbol-'0'] = v.dist;
            D[symbol-'0'][start] = v.dist;
        }
        
        if(r > 0 && free(r-1, c, grid)){
            Node u(r-1,c,v.dist+1);
            Q.push_back(u);
        }
        if(r < n-1 && free(r+1, c, grid)) {
            Node u(r+1,c,v.dist+1);
            Q.push_back(u);
        }
        if(c > 0 && free(r, c-1, grid)){
            Node u(r,c-1,v.dist+1);
            Q.push_back(u);
        }
        if(c < m-1 && free(r, c+1, grid)){
            Node u(r,c+1,v.dist+1);
            Q.push_back(u);
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> k;
    
    vector<vector<char> > grid(n, vector<char>(m));
    map<int,pair<int,int> > special;
    int coin_counter = 1;
    for(int i = 0; i < n; i++){
        string line; cin >> line;
        for(int j = 0; j < line.size(); j++){
            grid[i][j] = line[j]; 
            if(line[j] == '*'){
                grid[i][j] = '0' + coin_counter;
                special[coin_counter] = {i,j};
                coin_counter++;
            }
            else if(line[j] == 'A'){
                special[0] = {i,j};
                grid[i][j] = '0';
            }
            else if(line[j] == 'B'){
                special[k+1] = {i,j};
                grid[i][j] = '0' + k + 1;
            }
        }
        //for(auto c : grid[i]) cout << c; cout << endl;
    }
    
    vector<vector<int> > D(k+2, vector<int>(k+2));
    
    for(auto keyvalue : special){
        int id = keyvalue.first;
        int r = keyvalue.second.first;
        int c = keyvalue.second.second;
        bfs(r, c, id, grid, D);
    }
    
    if(k == 0){
        cout << D[0][k+1] <<  endl;
        return 0;
    }
    
    /*
    for(int i = 0; i < k+2; i++){
        for(int j = 0; j < k+2; j++){
            cout << D[i][j] << " ";
        }
        cout << endl;
    } */
    
    vector<int> permutation;
    for(int i = 1; i <= k; i++){
        permutation.push_back(i);
    }

    LL ans = 1e9;
    do {
        LL score = 0;
        for(int i = 0; i < k-1; i++){
            score += D[permutation[i]][permutation[i+1]];
        }
        score += D[0][permutation[0]];
        score += D[permutation.back()][k+1];
        ans = min(ans,score);
    } while (next_permutation(permutation.begin(), permutation.end()) );
    
    cout << ans << endl;
    
}

Test details

Test 1

Verdict: ACCEPTED

input
84 87 2
##############################...

correct output
104

user output
104

Test 2

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
264

user output
264

Test 3

Verdict: ACCEPTED

input
26 51 1
##############################...

correct output
48

user output
48

Test 4

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
145

user output
145

Test 5

Verdict: ACCEPTED

input
68 50 7
##############################...

correct output
88

user output
88

Test 6

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
187

user output
187

Test 7

Verdict: ACCEPTED

input
61 79 6
##############################...

correct output
149

user output
149

Test 8

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
232

user output
232

Test 9

Verdict: ACCEPTED

input
94 27 6
###########################
###########################
###########################
#############.#############
...

correct output
82

user output
82

Test 10

Verdict: ACCEPTED

input
100 100 0
##############################...

correct output
30

user output
30

Test 11

Verdict: ACCEPTED

input
65 100 6
######.#######################...

correct output
233

user output
233

Test 12

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
209

user output
209

Test 13

Verdict: ACCEPTED

input
75 18 3
##################
##################
##################
##################
...

correct output
72

user output
72

Test 14

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
196

user output
196

Test 15

Verdict: ACCEPTED

input
62 4 3
###.
####
####
####
...

correct output
44

user output
44

Test 16

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
231

user output
231

Test 17

Verdict: ACCEPTED

input
15 4 0
###.
.###
####
#.#.
...

correct output
4

user output
4

Test 18

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
300

user output
300

Test 19

Verdict: ACCEPTED

input
86 15 2
.########....##
#########......
#########......
#########......
...

correct output
88

user output
88

Test 20

Verdict: ACCEPTED

input
100 100 8
##############################...

correct output
288

user output
288

Test 21

Verdict: ACCEPTED

input
51 90 3
.................................

correct output
103

user output
103

Test 22

Verdict: ACCEPTED

input
100 100 8
.................................

correct output
352

user output
352

Test 23

Verdict: ACCEPTED

input
22 91 4
.................................

correct output
128

user output
128

Test 24

Verdict: ACCEPTED

input
100 100 8
.................................

correct output
317

user output
317

Test 25

Verdict: ACCEPTED

input
49 42 6
.................................

correct output
175

user output
175