rt,本地测试能过#1,但是评测后全部RE,求大佬帮调
#include <bits/stdc++.h>
using namespace std;
const int maxn=15;
int n,m,p,k,s;
int fx[]={0,1,-1,0},fy[]={1,0,0,-1};
vector<int> e[maxn*maxn*(1<<10)],e1[maxn*maxn*(1<<10)];
int id(int x,int y,int k)
{
return n*m*k+(x-1)*m+y;
}
int f[maxn][maxn];
int dis[maxn*maxn*(1<<10)];
void bfs()
{
queue<int> q;
q.push(id(1,1,0));
memset(dis,-1,sizeof(dis));
dis[id(1,1,0)]=0;
while(!q.empty())
{
int tmp=q.front();
// cout <<tmp<<endl;
q.pop();
for(int i=0;i<e[tmp].size();i++)
{
int v=e[tmp][i];
if(dis[v]==-1)
{
dis[v]=dis[tmp]+1;
q.push(v);
}
}
}
}
int ys[maxn][maxn][maxn];
int connect(int x,int y)
{
for(int i=0;i<e1[y].size();i++)
e[x].push_back(e1[y][i]);
}
int main()
{
cin >>n>>m>>p>>k;
memset(f,-1,sizeof(f));
for(int i=1;i<=k;i++)
{
int x1,y1,x2,y2,g;
cin >>x1>>y1>>x2>>y2>>g;
f[id(x1,y1,0)][id(x2,y2,0)]=g;
f[id(x2,y2,0)][id(x1,y1,0)]=g;
}
for(int k=0;k<(1<<p);k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int l=0;l<4;l++)
{
int x=i+fx[l],y=j+fy[l];
if(x<=0||x>n||y<=0||y>m||f[id(x,y,0)][id(i,j,0)]==0)
continue;
if(f[id(x,y,0)][id(i,j,0)]==-1||int(k&(1<<f[id(x,y,0)][id(i,j,0)]-1)))
{
e[id(x,y,k)].push_back(id(i,j,k));
//e[id(i,j,k)].push_back(id(x,y,k));
}
}
}
}
}
// for(int i=0;i<e[1].size();i++)
// cout <<e[1][i]<<endl;
// cout <<id(2,1,0)<<endl;
for(int i=id(1,1,0);i<=id(n,m,(1<<p)-1);i++)
e1[i]=e[i];
cin >>s;
for(int i=1;i<=s;i++)
{
int x,y,q;
cin >>x>>y>>q;
ys[x][y][q]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int d=0;
for(int k=1;k<=p;k++)
if(ys[i][j][k])
d=d|(1<<k-1);
if(d)
{
for(int k=0;k<(1<<p);k++)
{
if((k&d)!=d)
connect(id(i,j,k),id(i,j,(k|d)));
}
}
// cout <<d<<endl;
}
// cout<<s<<endl;
bfs();
int ans=0x3f3f3f3f;
for(int i=0;i<(1<<p);i++)
{
if(dis[id(n,m,i)]!=-1)
ans=min(ans,dis[id(n,m,i)]);
}
cout <<(ans==0x3f3f3f3f?-1:ans)<<endl;
return 0;
}