[NOIP2013]华容道

也就是存个板子2333

图论题,把状态当做点,四个状态分别上下左右,然后先把空格移到起点,空格再带着起点满地图跑[/手动滑稽]

然后,,,去吧,代码菌!!

#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<vector>
#include<iostream>
#define ll long long
#define re register
#define inf 0x7f7f7f7f
#define inl inline
#define sqr(x) (x*x)
#define max(a,b) (a>b?a:b)
#define eps 1e-8
#define debug puts("**************************");
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
using namespace std;
//const ll mod;
const ll MAXN=35;
inl ll read() {
    re ll x = 0; re int f = 1;
    char ch = getchar();
    while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }
    while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x * f;
}
inl char readc() {
    char ch=getchar();
    while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();
    return ch;
}
inl void write(re ll x){
    if(x>=10)write(x/10);
    putchar(x%10+'0');
}
inl void writeln(re ll x){
    if(x<0) {x=-x;putchar('-');}
    write(x); puts("");
}
inl ll gcd(re ll x,re ll y) {while(y^=x^=y^=x%=y);return x;}
inl ll Lcm(re ll a,re ll b) {return a/gcd(a,b)*b;}
inl void FR() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}
inl void FC() {
    fclose(stdin);
    fclose(stdout);
}
ll n,m,q,mapn[MAXN][MAXN],minx,tot,en1[5],en2[5],pay[5],ex,ey;
ll l[MAXN][MAXN][MAXN][MAXN],vis[MAXN][MAXN],to[5],sx,sy,tx,ty;
ll d[MAXN][MAXN][MAXN][MAXN][4],see[MAXN][MAXN],tp[MAXN][MAXN];
ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
struct o {ll x,y,dis;};
inl void spfa(ll x,ll y,ll k) {
    queue<o>Q;
    d[x][y][x][y][k]=0;
    Q.push((o){x,y,0});
    while(!Q.empty()) {
        o t=Q.front();Q.pop();
        see[t.x][t.y]=0;
        for(re ll i=0;i<4;i++) {
            re ll xx=t.x+dx[i],yy=t.y+dy[i];
            if(mapn[xx][yy]&&d[x][y][xx][yy][k]>d[x][y][t.x][t.y][k]+l[t.x][t.y][xx][yy]&&l[t.x][t.y][xx][yy]) {
                d[x][y][xx][yy][k]=d[x][y][t.x][t.y][k]+l[t.x][t.y][xx][yy];
                if(!see[xx][yy]) {
                    see[xx][yy]=1;Q.push((o){xx,yy,0});
                }
            }
        }
    }
}
inl void bfs() {
    queue<o>Q;
    Q.push((o){ex,ey,0});
    vis[ex][ey]=0;
    while(!Q.empty()) {
        o t=Q.front();Q.pop();
        for(re ll i=0;i<4;i++) {
            re ll xx=t.x+dx[i],yy=t.y+dy[i];
            if(vis[xx][yy]) {
                if(xx==sx&&yy==sy) {
                    tot++;
                    to[tot]=i;
                    en1[tot]=t.x;
                    en2[tot]=t.y;
                    pay[tot]=t.dis;
                }
                else {
                    vis[xx][yy]=0;
                    Q.push((o){xx,yy,t.dis+1});
                }
            }
        }
    }
}
void dfs(ll x,ll y,ll fa1,ll fa2,ll to,ll tott) {
    if(tott>=minx) return ;
    if(x==tx&&y==ty) {minx=tott;return ;}
    mapn[x][y]=0;
    for(re ll i=0;i<4;i++) {
        re ll xx=x+dx[i],yy=y+dy[i];
        if(d[fa1][fa2][xx][yy][to]<1e5&&!tp[xx][yy]) {
            tp[xx][yy]=1;
            dfs(xx,yy,x,y,i,tott+d[fa1][fa2][xx][yy][to]+1);
            tp[xx][yy]=0;
        }
    }
    mapn[x][y]=1;
}
int main() {
//  FR();
    memset(d,1,sizeof(d));
    n=read(),m=read(),q=read();
    for(re ll i=1;i<=n;i++) {
        for(re ll j=1;j<=m;j++) {
            mapn[i][j]=read();
        }
    }
    for(re ll i=1;i<=n;i++) {
        for(re ll j=1;j<=m;j++) {
            for(re ll k=0;k<4;k++) {
                re ll xx=i+dx[k],yy=j+dy[k];
                if(mapn[xx][yy]){
                    l[xx][yy][i][j]=1;
                    l[i][j][xx][yy]=1;
                }
            }
        }
    }
    for(re ll i=1;i<=n;i++) {
        for(re ll j=1;j<=m;j++) {
            for(re ll k=0;k<4;k++) {
                re ll xx=i+dx[k],yy=j+dy[k];
                if(mapn[i][j]&&mapn[xx][yy]) {
                    mapn[xx][yy]=0;
                    spfa(i,j,k);
                    mapn[xx][yy]=1;
                }
            }
        }
    }
    for(re ll t=1;t<=q;t++) {
        for(re ll i=1;i<=n;i++) {
            for(re ll j=1;j<=m;j++) vis[i][j]=mapn[i][j];
        }
        ex=read(),ey=read();
        sx=read(),sy=read();
        tx=read(),ty=read();
        tot=0;
        if(sx==tx&&sy==ty) {puts("0");continue ;}
        bfs();
        if(!tot) {puts("-1");continue ;}
        minx=9999999;
        for(re ll i=1;i<=tot;i++) {
            dfs(sx,sy,en1[i],en2[i],to[i],pay[i]);
        }
        writeln((minx==9999999)?-1:minx);
    }
//  FC();
    return 0;
}
原文地址:https://www.cnblogs.com/20020723YJX/p/9538366.html