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

Code

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <queue>
#include <algorithm>
#include <vector>
#include <set>
#include <cstdlib>
#include <stack>

using namespace std;

#define all(x) (x).begin(),x.end()
#define ii pair<int, int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long

#define MAXN 101
#define INF 1000000007

int nR, nC, nCoin;
int a[MAXN][MAXN];
vector<int> eList[20], cList[20];
int d[MAXN][MAXN];

bool mark[20];
int res, cur, exitNode;

int dx[] = {0, -1, 0, 1};
int dy[] = {-1, 0, 1, 0};

void bfs(int si, int sj) {
	queue<ii> q;
	int i = a[si][sj];
	q.push(ii(si, sj));

	memset(d, -1, sizeof(d));
	d[si][sj] = 0;

	while (!q.empty()) {
		ii top = q.front();
		q.pop();

		if (a[top.fi][top.se] > 0) {
			int j = a[top.fi][top.se];
			eList[i].pb(j);
			cList[i].pb(d[top.fi][top.se]);
		}

		for (int k = 0; k < 4; k++) {
			int r = top.fi + dx[k];
			int c = top.se + dy[k];
			if (r < 0 || r >= nR || c < 0 || c >= nC || a[r][c] == -1) {
				continue;
			}

			if (d[r][c] == -1) {
				d[r][c] = d[top.fi][top.se] + 1;
				q.push(ii(r, c));

			}
		}
	}
} 

void dfs(int i) {
	if (i == exitNode) {
		bool found = false;
		for (int k = 2; k < exitNode; k++) {
			if (mark[k] == false) {
				found = true;
				break;
			}
		}
		if (!found && cur < res) {
			res = cur;
		}

		return;
	}

	for (int k = 0; k < (int)eList[i].size(); k++) {
		int j = eList[i][k];
		if (mark[j]) {
			continue;
		}

		mark[j] = true;
		cur += cList[i][k];
		dfs(j);

		mark[j] = false;
		cur -= cList[i][k];
	}
}

int main() {
	memset(a, 0, sizeof(a));

	cin >> nR >> nC >> nCoin;
	char tmp;
	int count = 2;
	exitNode = nCoin + 2;
	for (int i = 0; i < nR; i++) {
		for (int j = 0; j < nC; j++) {
			cin >> tmp;
			if (tmp == '#') {
				a[i][j] = -1;
			} else if (tmp == 'A') {
				a[i][j] = 1;
			} else if (tmp == '*') {
				a[i][j] = count;
				count++;
			} else if (tmp == 'B') {
				a[i][j] = exitNode;
			}
		}
	}

	for (int i = 0; i < nR; i++) {
		for (int j = 0; j < nC; j++) {
			if (a[i][j] > 0) {
				bfs(i, j);
			}
		}
	}

	res = INF;
	cur = 0;
	memset(mark, 0, sizeof(mark));
	mark[1] = true;
	dfs(1);

	cout << res;
	return 0;
}

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