RT
主程序中dis中的顺序会影响答案
有没有大佬帮忙解答一下,蒟蒻百思不得其解
#include<bits/stdc++.h>
using namespace std;
const int maxn = (1 << 10) + 5;
inline void read(int &x);
#define r1(x) read(x)
int n, m, D, ans = -0x3f3f3f3f, mmax;
int sum[maxn],v[20];
int f[20][20][maxn];
char c[20][20];
int ax[20],ay[20];
int vis[20][20][1<<11];
struct Node{
int x,y,s;
Node(int aa=0,int bb=0,int cc=0){
x=aa,y=bb,s=cc;
}
};
int dis[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};
//int xx[4] = {0,-1,0,1},yy[4] = {-1,0,1,0};
int solve(int mx,int my,int nx,int ny,int ms) {
int ns(ms);
for(int i = 1;i <= D; ++i) {
if(((mx == ax[i] && nx < ax[i]) || (mx < ax[i] && nx == ax[i])) && ny > ay[i]) {
ns ^= (1 << (i - 1));
}
}
return ns;
}
void spfa(int x,int y) {
// memset(vis,0,sizeof(vis));
memset(f,0x3f,sizeof(f));
f[x][y][0] = 0;
queue<Node> q;
q.push((Node){x,y,0});
while(!q.empty()) {
Node u = q.front();
q.pop();
int mx = u.x,my = u.y,ms = u.s;
vis[mx][my][ms] = 0;
for(int i = 0;i < 4; ++i) {
// int nx = mx + xx[i],ny = my + yy[i];
int nx = mx + dis[i][0], ny = my + dis[i][1];
if(nx < 1 || ny < 1 || nx > n || ny > m || (c[nx][ny] >= '1' && c[nx][ny] <= '9') || c[mx][my] == '#') continue;
int ns(ms);
if(i & 1) ns = solve(mx,my,nx,ny,ns);
if(f[mx][my][ms] < f[nx][ny][ns]) {
f[nx][ny][ns] = f[mx][my][ms] + 1;
if(!vis[nx][ny][ns]) {
vis[nx][ny][ns] =1;
q.push((Node){nx,ny,ns});
}
}
}
}
for(int i = 0;i < mmax; ++i) {
ans = max(ans,sum[i] - f[x][y][i]);
}
}
int main() {
// freopen("perfume.in","r",stdin);
// freopen("perfume.out","w",stdout);
int i, j;
r1(n),r1(m),r1(D);
mmax = 1 << D;
for(i = 1;i <= D; ++i) {
r1(v[i]);
}
for(int i=0;i<mmax;i++){
for(int j=1;j<=D;j++){
if(i&(1<<(j-1))) sum[i]+=v[j];
}
}
// for(i = 0;i < mmax;++i ) {
// for(j = 1;j <= D; ++j) {
// if((1 << (j - 1)) & i) sum[i] += v[j];
// }
// }
for(i = 1;i <= n; ++i) {
// cin >> c[i];
// scanf("%s",c[i]+1);
cin >> (c[i] + 1);
}
for(i = 1;i <= n; ++i) {
for(j = 1;j <= m; ++j) {
if('0' < c[i][j] && c[i][j] <= '9') {
int now = c[i][j] - '0';
ax[now] = i,ay[now] = j;
}
}
}
for(i = 1;i <= n; ++i) {
for(j = 1;j <= m; ++j) {
if(c[i][j] == '0') {
spfa(i,j);
}
}
}
for(i = 0;i < 4; ++i)
printf("%d %d\n",dis[i][0],dis[i][1]);
printf("%d\n",ans);
return 0;
}
inline void read(int &x) {
char c = getchar();
x = 0;
int f = 1;
for(; !isdigit(c);c = getchar()) if(c == '-') f = -1;
for(; isdigit(c);c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
// f?x:-x;
x *= f;
}