HDU 3681

没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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值