没AC,挖个坑
2B,MLE做法:
#include <bits/stdc++.h>
using namespace std;
vector<int>emv;
set<int>ems;
const int INF=0x3f3f3f3f;
typedef struct VIS{
vector<int>gsi;
set<int>ysi;
VIS(vector <int> gmark=emv,set<int>yflag=ems){
gsi=gmark;ysi=yflag;
}
bool operator < (const VIS &a)const{
if(gsi==a.gsi)
return 0;
return 1;
}
bool operator >(const VIS &a)const{
if(a.ysi==ysi)
return 0;
return 1;
}
}VIS;
typedef struct Node{
int x;int y;int step;vector<int>gmark;int need;set<int>yflag;set<int>gflag;
Node(int xx=0,int yy=0,int ss=0,vector<int>g=emv,int nn=0,set<int>s=ems,set<int>sg=ems){
x=xx;y=yy;step=ss;gmark=g;need=step;yflag=s;gflag=sg;
for(vector<int>::iterator it=gmark.begin();it!=gmark.end();it++)
need=min(need,max(*it,step-*it));
}
bool operator <(const Node &a)const{
if(a.need==need){
if(a.step==step){
if(a.yflag.size()==yflag.size()){
return a.gmark.size()<gmark.size();
}
return a.yflag.size()<yflag.size();
}
return a.step<step;
}
return a.need<need;
}
}Node;
set <VIS> emV;
int dirx[]={1,0,0,-1};
int diry[]={0,-1,1,0};
int main()
{
int n,m;
emv.clear();
ems.clear();
emV.clear();
while(~scanf("%d %d",&n,&m)){
if(n==0) break;
Node st;
char a[30][30];
map <pair<int,int> ,int> flagy;
map <pair<int,int> ,int> flagg;
int pp=0;int ppp=0;
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='F'){
st.x=i;st.y=j;st.step=0;
a[i][j]='S';
}else if(a[i][j]=='Y'){
flagy[make_pair(i,j)]=++pp;
}else if(a[i][j]=='G'){
flagg[make_pair(i,j)]=++ppp;
}
}
getchar();
}
priority_queue <Node> que;
st.gmark=emv;st.yflag=ems;st.need=0;st.gflag=ems;
que.push(st);
int ans=-1;
set <VIS> vis[30][30];
for(int i=0;i<30;i++)
for(int j=0;j<30;j++)
vis[i][j]=emV;
VIS vst(st.gmark,st.yflag);
vis[st.x][st.y].insert(vst);
//int cutt=0;
while(!que.empty()){
Node t=que.top();
//cutt++;
//cout<<t.x<<" "<<t.y<<" "<<t.gmark.size()<<" "<<t.yflag.size()<<" "<<t.need<<" "<<t.step<<endl;
que.pop();
for(int i=0;i<4;i++){
int xx=t.x+dirx[i];
int yy=t.y+diry[i];
if(xx<0||xx>=n||yy<0||yy>=m) continue;
if(a[xx][yy]=='D') continue;
int ste=t.step+1;
vector <int> gm=t.gmark;
set<int> yf=t.yflag;
set<int> gf=t.gflag;
if(a[xx][yy]=='G'){
if(gf.find(flagg[make_pair(xx,yy)])==gf.end()){
gf.insert(flagg[make_pair(xx,yy)]);
gm.push_back(ste);
}
}
if(a[xx][yy]=='Y')
if(yf.find(flagy[make_pair(xx,yy)])==yf.end())
yf.insert(flagy[make_pair(xx,yy)]);
Node ne(xx,yy,ste,gm,0,yf,gf);
VIS vt(ne.gmark,ne.yflag);
if(vis[xx][yy].find(vt)==vis[xx][yy].end()){
if(ne.yflag.size()==pp){
ans=ne.need;
goto A;
}
vis[xx][yy].insert(vt);
que.push(ne);
//cout<<ne.x<<" "<<ne.y<<endl;
}
}
}
A:cout<<ans<<endl;
//cout<<cutt<<endl;
}
}