-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathgard4.cpp
113 lines (104 loc) · 2.62 KB
/
gard4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# include <bits/stdc++.h>
# define INF 999999999
# define NR 40
# define mp make_pair
# define f first
# define s second
using namespace std;
ifstream f("gard4.in");
ofstream g("gard4.out");
struct elem {
int x, y, K, cost;
}E;
vector <elem> HEAP;
vector <pair <int, int> > col[NR];
struct cmp {
bool operator () (const elem &x, const elem &y) {
return x.cost > y.cost;
}
};
int i,j,n,m,x,y,minn,DR,K,I,J;
int a[NR][NR], cost[NR][NR][1<<5];
int dx[]={-1, -1, 0, 1, 1, 1, 0, -1};
int dy[]={0, 1, 1, 1, 0, -1, -1, -1};
int schimb[]={-5, 1, 1, 1, -5, 0, 0, 0};
void bordare () {
for (int i=0; i<=n+1; ++i)
a[0][i]=a[n+1][i]=a[i][0]=a[i][n+1]=-1;
}
void init () {
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
for (int k=0; k<=(1<<K)-1; ++k)
cost[i][j][k]=INF;
}
void baga (int x, int y, int K, int cost) {
elem E;
E.x=x; E.y=y; E.K=K; E.cost=cost;
HEAP.push_back(E);
push_heap(HEAP.begin(), HEAP.end(), cmp());
}
void scoate () {
pop_heap(HEAP.begin(), HEAP.end(), cmp());
HEAP.pop_back();
}
int make_bits (int J, int H) {
int X=0;
for (auto &x: col[J]) {
if (x.f > H) {
X+=(1<<x.s);
}
}
return X;
}
void djikstra () {
int x, y, K, cact, Kurm, lv, cv, X;
while (HEAP.size()) {
E=HEAP[0]; scoate();
x=E.x; y=E.y; K=E.K; cact=E.cost;
if (cact != cost[x][y][K]) continue;
for (int i=0; i<8; ++i) {
lv=x + dx[i]; cv=y + dy[i];
if (a[lv][cv]!=-1) {//daca pot pasi aici
if (schimb[i]!=-5) {
if (schimb[i]==1) X=make_bits(y + schimb[i], lv);
else X=make_bits(y, x);
}
else X=0;
Kurm=K xor X;
if (cost[lv][cv][Kurm] > cost[x][y][K] + a[lv][cv]) {
cost[lv][cv][Kurm]=cost[x][y][K] + a[lv][cv];
baga(lv, cv, Kurm, cost[lv][cv][Kurm]);
}
}
}
}
}
int main ()
{
f>>n; DR=INF; bordare();
for (i=1; i<=n; ++i) {
for (j=1; j<=n; ++j) {
f>>a[i][j];
if (a[i][j]==-1) {//un nou punct
col[j].push_back(mp(i, K));
++K;
if (j<DR) {
DR=j;
I=i; J=j;
}
}
}
}
minn=INF;
for (i=1; i<=J; ++i) {
init ();
baga(I, i, 0, 0);
cost[I][i][0]=0;
djikstra ();
if (cost[I][i][(1<<K) - 1] < minn)
minn=cost[I][i][(1<<K) - 1];
}
g<<minn<<"\n";
return 0;
}