NOIP2019翻车前写过的代码

咕咕咕。


//树的重心
void dfs(int x) {
    v[x]=1; size[x]=1;
    int max_part=0;
    for(int i=hed[x];i;i=nxt[i])
    {
        int y=ver[i];
        if(v[y]) continue;
        dfs(y); size[x]+=size[y];
        max_part=max(max_part,size[y]);
    }
    max_part=max(max_part,n-size[x]);
    if(max_part<ans) {
        ans=max_part;
        ans_node=x;
    }
}
//推箱子,没AC
#include<bits/stdc++.h>
using namespace std;
const int maxn=31;

char s[maxn][maxn];
int n,m;

struct node{
    int x,y,dir;
}st[7],ed[7];
int stcnt,edcnt;

struct node2{
    int x,y;
}manst;

int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int ddir[4]={1,0,3,2};

node pre_box[maxn][maxn][4];
int min_box[maxn][maxn][4],min_man[maxn][maxn][4];

bool valid(int x,int y)
{
    if(x<1||x>n||y<1||y>m) return false;
    return s[x][y]=='#' ? false : true;
}

bool connect(int r,int c)//man to r,c
{
    int vis[maxn][maxn]={0}; vis[manst.x][manst.y]=1;
    queue<node2>q;
    q.push(manst);
    while(!q.empty())
    {
        node2 u=q.front();q.pop();
        if(u.x==r&&u.y==c) return true;
        for(int i=0;i<4;++i)
        {
            node2 v=(node2){u.x+dx[i],u.y+dy[i]};
            if(!valid(v.x,v.y)||vis[v.x][v.y]) continue;
            q.push(v); vis[v.x][v.y]=1;
        }
    }
    return false;
}

void findsted()
{
    stcnt=edcnt=0;
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    {
        if(s[i][j]=='S') {
            s[i][j]='.';
            manst.x=i,manst.y=j;
        }
        if(s[i][j]=='T') {
            s[i][j]='.';
            for(int D=0;D<4;++D) {
                if(valid(i+dx[D],j+dy[D])) {
                    ed[++edcnt]=(node){i,j,D};
                }
            }
        }
    }
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    {
        if(s[i][j]=='B') {
            s[i][j]='.';
            for(int D=0;D<4;++D) {
                if(valid(i+dx[D],j+dy[D])) {
                    s[i][j]='#';
                    if(connect(i+dx[D],j+dy[D]))
                    st[++stcnt]=(node){i,j,D};
                    s[i][j]='.';
                }
            }
        }
    }
}

int getstep(node U,node V)
{
    node2 S=(node2){U.x+dx[U.dir],U.y+dy[U.dir]};
    node2 T=(node2){U.x+dx[V.dir],U.y+dy[V.dir]};
    int step[maxn][maxn]; memset(step,-1,sizeof step);
    queue<node2>q;
    q.push(S); step[S.x][S.y]=0;
    while(!q.empty())
    {
        node2 u=q.front();q.pop();
        if(u.x==T.x&&u.y==T.y) return step[u.x][u.y];
        for(int i=0;i<4;++i)
        {
            node2 v=(node2){u.x+dx[i],u.y+dy[i]};
            if(!valid(v.x,v.y)||step[v.x][v.y]!=-1) continue;
            q.push(v); step[v.x][v.y]=step[u.x][u.y]+1;
        }
    }
    return -1;
}

int getstep(node2 U,node V)
{
    node2 T=(node2){V.x+dx[V.dir],V.y+dy[V.dir]};
    int step[maxn][maxn]; memset(step,-1,sizeof step);
    queue<node2>q;
    q.push(U); step[U.x][U.y]=0;
    while(!q.empty())
    {
        node2 u=q.front();q.pop();
        if(u.x==T.x&&u.y==T.y) return step[u.x][u.y];
        for(int i=0;i<4;++i)
        {
            node2 v=(node2){u.x+dx[i],u.y+dy[i]};
            if(!valid(v.x,v.y)||step[v.x][v.y]!=-1) continue;
            q.push(v); step[v.x][v.y]=step[u.x][u.y]+1;
        }
    }
    return -1;
}

bool is_ans(node u)
{
    for(int i=1;i<=edcnt;++i)
    if(ed[i].x==u.x&&ed[i].y==u.y&&ed[i].dir==u.dir) return true;
    return false;
}

int solve()
{
    int jd=-1;
    memset(min_box,63,sizeof min_box);
    memset(min_man,63,sizeof min_man);
    queue<node>q;
    for(int i=1;i<=stcnt;++i)
    {
        q.push(st[i]);
        min_box[st[i].x][st[i].y][st[i].dir]=0;
        s[st[i].x][st[i].y]='#';
        min_man[st[i].x][st[i].y][st[i].dir]=getstep(manst,st[i]);
        s[st[i].x][st[i].y]='.';
        pre_box[st[i].x][st[i].y][st[i].dir].x=0;
    }
    while(!q.empty())
    {
        node u=q.front();q.pop();
//      printf("u(%d,%d)\n",u.x,u.y);
        if(is_ans(u)) jd=1;
        for(int i=0;i<4;++i)
        {
            node v=(node){u.x+dx[i],u.y+dy[i],ddir[i]};
            if(!valid(v.x,v.y) || !valid(u.x+dx[v.dir],u.y+dy[v.dir])) continue;
            if(min_box[u.x][u.y][u.dir]+1>min_box[v.x][v.y][v.dir]) continue;
            s[u.x][u.y]='#';
            int step=getstep(u,v);
            s[u.x][u.y]='.';
            if(step==-1) continue;
            if(min_box[u.x][u.y][u.dir]+1==min_box[v.x][v.y][v.dir]&&
            min_man[u.x][u.y][u.dir]+step>min_man[v.x][v.y][v.dir]) continue;
            min_box[v.x][v.y][v.dir]=min_box[u.x][u.y][u.dir]+1;
            min_man[v.x][v.y][v.dir]=min_man[u.x][u.y][u.dir]+step;
            pre_box[v.x][v.y][v.dir]=u;
            q.push(v);
        }
    }
    return jd;
}

void putlina(int ind)
{
    switch(ind)
    {
        case 0:cout<<'s';break;
        case 1:cout<<'n';break;
        case 2:cout<<'e';break;
        case 3:cout<<'w';break;
    }
}

void putlinA(int ind)
{
    switch(ind)
    {
        case 0:cout<<'S';break;
        case 1:cout<<'N';break;
        case 2:cout<<'E';break;
        case 3:cout<<'W';break;
    }
}

void road(int sx,int sy,int ex,int ey)
{
    int pre[maxn][maxn]; memset(pre,-1,sizeof pre);
    pre[sx][sy]=-2; queue<node2>q; q.push((node2){sx,sy});
    while(!q.empty())
    {
        node2 u=q.front(); q.pop();
        if(u.x==ex&&u.y==ey)
        {
            stack<int>sta;
            while(pre[u.x][u.y]!=-2) {
                sta.push(pre[u.x][u.y]);
                int d=pre[u.x][u.y];//
                u.x+=dx[d], u.y+=dy[d];
            }
            while(!sta.empty())
            {
                putlina(sta.top());
                sta.pop();
            }
            return;
        }
        for(int i=0;i<4;++i) {
            node2 v=(node2){u.x+dx[i],u.y+dy[i]};
            if(!valid(v.x,v.y)) continue;
            if(pre[v.x][v.y]!=-1) continue;
            q.push(v); pre[v.x][v.y]=ddir[i];
        }
    }
}

void out()
{
    stack<node>sta;
    int boxx=1010010101,mann=1010010101,i;
    for(int j=1;j<=edcnt;++j)
    if(min_box[ed[j].x][ed[j].y][ed[j].dir]<boxx ||
    min_box[ed[j].x][ed[j].y][ed[j].dir]==boxx&&min_man[ed[j].x][ed[j].y][ed[j].dir]<mann)
    {
        boxx=min_box[ed[j].x][ed[j].y][ed[j].dir];
        mann=min_man[ed[j].x][ed[j].y][ed[j].dir];
        i=j;
    }
    node u=ed[i];
    while(u.x) sta.push(u), u=pre_box[u.x][u.y][u.dir];
    vector<node>vec;
    while(!sta.empty()) {
        vec.push_back(sta.top());
        sta.pop();
    }
    s[st[1].x][st[1].y]='#';
    road(manst.x,manst.y,vec[0].x+dx[vec[1].dir],vec[0].y+dy[vec[1].dir]);
    s[st[1].x][st[1].y]='.';
    putlinA(vec[1].dir);
    for(int k=2;k<(int)vec.size();++k) {
        s[vec[k-1].x][vec[k-1].y]='#';
        road(vec[k-1].x+dx[vec[k-1].dir],vec[k-1].y+dy[vec[k-1].dir],vec[k-1].x+dx[vec[k].dir],vec[k-1].y+dy[vec[k].dir]);
        s[vec[k-1].x][vec[k-1].y]='.';
        putlinA(vec[k].dir);
    }
    return;
}

int main()
{
    int T=0;
    while(scanf("%d%d",&n,&m)==2 && n)
    {
        memset(s,0,sizeof s);
        for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
        findsted();
        printf("Maze #%d\n",++T);
        if(solve()==-1) printf("Impossible.\n\n");
        else
        out(),printf("\n\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/tztqwq/p/11641335.html
今日推荐