• [题解]NOIP2013,洛谷P1979 华容道/70分暴力


    背景

      我好蒻啊,这题打了半天(而且还是暴力)

      

      第一次打紫题(的暴力),有点小激动呢。。。

    原题

      传送门

    思路

      (我当然只会写暴力)

      首先肯定是BFS

      这是样例1的图解

       

      题中一个点可以有多次游戏,但是图都是一样的,每次变化的只有ex,ey,sx,sy,tx,ty。

      “任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白格子上”就相当于:空白格子可以移动到上下左右的非0格子中。那么每次移动后(ex,ey)一定会变,(sx,sy)可能会变,(tx,ty)一定不变。

      那么我们的搜索对象就是:struct Node{int ex,ey,sx,sy,dist;/*走到这个状态的步数*/};

      当然还要判重,由于数据规模不大,完全可以用一个四位数组标记。

    代码

    #include<cstdio>
    #include<queue>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int n,m,t,g[32][32]= {0},ex,ey,sx,sy,tx,ty;
    
    int dx[]= {-1,1,0,0},dy[]= {0,0,-1,1};
    
    struct Node {
        int ex,ey,sx,sy,dist;
    };
    
    int vis[32][32][32][32]= {0};
    void bfs() {
        queue<Node> q;
        Node start;
        start.ex=ex;
        start.ey=ey;
        start.sx=sx;
        start.sy=sy;
        start.dist=0;
        q.push(start);
        vis[ex][ey][sx][sy]=1;
    
        while(!q.empty()) {
            Node fr=q.front();
            q.pop();
            if(fr.sx==tx&&fr.sy==ty) {
                printf("%d
    ",fr.dist);
                return;
            }
            for(int i=0; i<4; i++) {
                Node tag=fr;
                tag.ex=fr.ex+dx[i],tag.ey=fr.ey+dy[i];
                if(g[tag.ex][tag.ey]) {
                    tag.dist++;
                    if(tag.ex==fr.sx&&tag.ey==fr.sy) {
                        tag.sx=fr.ex;
                        tag.sy=fr.ey;
                    }
                    if(!vis[tag.ex][tag.ey][tag.sx][tag.sy]) {
                        vis[tag.ex][tag.ey][tag.sx][tag.sy]=1;
                        q.push(tag);
                    }
                }
            }
        }
        printf("-1
    ");
    }
    
    int main() {
        scanf("%d%d%d",&n,&m,&t);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                scanf("%d",&g[i][j]);
        while(t--) {
            scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
            memset(vis,0,sizeof(vis));
            if(sx==tx&&sy==ty) {
                printf("0
    ");
                continue;
            }
            bfs();
        }
        return 0;
    }
    本篇文章为SHINE_GEEK原创,转载请注明来源!
    written_by:SHINE_GEEK

    -------------------------------------
    签名:自己选的路,跪着也要走完;理想的实现,需要不懈奋斗!
    -------------------------------------
  • 相关阅读:
    unittest用法和report输出
    python断言方式
    python闭包等
    html 基础
    Python装饰器
    python递归取出n层嵌套列表里的所有元素
    pycharm问题集锦
    Coding the Futurn
    python3-端口扫描(TCP_ACK扫描,NULL扫描,windows扫描,xmas扫描)
    python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描)
  • 原文地址:https://www.cnblogs.com/sjrb/p/10313436.html
Copyright © 2020-2023  润新知