救救我!!!!
我已经调过 $ 10^9 $ 天的程序了
那啥吃豆子仍然报单......
代码奉上
#include<bits/stdc++.h>
using namespace std;
int n;
int m;
int d;
struct node
{
int x;
int y;
int sta;
}bean[15];
int b[15];
char Map[15][15];
int dis[15][15][1025];
int dam[1025];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
bool iq[15][15][1025];
queue<node> q;
int ans;
void spfa(int sx, int sy)
{
memset(dis,0x3f,sizeof(dis));
q.push((node){sx,sy,0});
iq[sx][sy][0] = 1;
dis[sx][sy][0] = 0;
while(!q.empty())
{
int ux = q.front().x;
int uy = q.front().y;
int Sta = q.front().sta;
q.pop();
iq[ux][uy][Sta] = 0;
for(int i = 0; i<4; i++)
{
int vx = ux+dx[i];
int vy = ux+dy[i];
int S = Sta;
if(vx<1 || vx>n || vy<1 || vy>m || Map[vx][vy] != '0')
{
continue;
}
if(i>1)
{
for(int j = 1; j<=d; j++)
{
if((bean[j].x == ux && ux>vx || bean[j].x == vx && vx>ux) && bean[j].y<uy)
{
S^=(1<<j-1);
}
}
}
if(dis[ux][uy][Sta] + 1 < dis[vx][vy][S])
{
dis[vx][vy][S]=dis[ux][uy][Sta]+1;
if(!iq[vx][vy][S])
{
q.push((node){vx,vy,S});
iq[vx][vy][S] = 1;
}
}
}
}
for(int i = 0; i<=(1<<d); i++)
{
ans = max(ans,dam[i]-dis[sx][sy][i]);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
cin>>d;
for(int i = 1; i<=d; i++)
{
cin>>b[i];
}
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
cin>>Map[i][j];
}
}
for(int i = 1; i<=(1<<d); i++)
{
for(int j = 1; j<=d; j++)
{
if(i&(1<<j-1))
{
dam[i]+=b[j];
}
}
}
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
if(Map[i][j]>='1' && Map[i][j]<='9')
{
bean[Map[i][j]-'0'].x = i;
bean[Map[i][j]-'0'].y = j;
}
}
}
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
if(Map[i][j] == '0')
{
spfa(i,j);
}
}
}
cout<<ans;
return 0;
}