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
|
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MXN=15;
const int NR=55;
const int nxto[4][2]={
{1,0},{-1,0},{0,1},{0,-1}
};
int s,p;
int n,a,b;
int sx,sy;
int tx[MXN],ty[MXN],dt[MXN];
bool map[NR][NR];
int dis[NR][NR][NR][NR];
bool vis[MXN];
int mx=-1;
void dfs(int curx,int cury,int curf,int curcnt){
if(curcnt==0){
if(dis[curx][cury][sx][sy]*p>curf)return;
mx=max(mx,curf-dis[curx][cury][sx][sy]*p);
return;
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
if(dis[curx][cury][tx[i]][ty[i]]*p>curf)continue;
vis[i]=1;
dfs(tx[i],ty[i],curf+dt[i]-dis[curx][cury][tx[i]][ty[i]]*p,curcnt-1);
vis[i]=0;
}
return;
}
int main(){
scanf("%d%d%d",&s,&p,&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",tx+i,ty+i,dt+i);
scanf("%d%d",&a,&b);
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
scanf("%d",&map[i][j]);
scanf("%d%d",&sx,&sy);
//floyd
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++){
dis[i][j][i][j]=0;
if(!map[i][j])continue;
for(int tmp=0;tmp<4;tmp++){
int nx=i+nxto[tmp][0];
int ny=j+nxto[tmp][1];
if(nx<1 || ny<1 || nx>a || ny>b)continue;
if(map[nx][ny])dis[i][j][nx][ny]=1;
}
}
//mid
for(int kx=1;kx<=a;kx++)
for(int ky=1;ky<=b;ky++){
if(!map[kx][ky])continue;
//start
for(int x1=1;x1<=a;x1++)
for(int y1=1;y1<=b;y1++){
if(!map[x1][y1])continue;
//end
for(int x2=1;x2<=a;x2++)
for(int y2=1;y2<=b;y2++){
if(!map[x2][y2])continue;
dis[x1][y1][x2][y2]=min(\
dis[x1][y1][x2][y2],\
dis[x1][y1][kx][ky]+dis[kx][ky][x2][y2]);
}
}
}
memset(vis,0,sizeof(vis));
dfs(1,1,s,n);
printf("%d\n",mx);
return 0;
}
|