zoukankan      html  css  js  c++  java
  • [题解]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

    -------------------------------------
    签名:自己选的路,跪着也要走完;理想的实现,需要不懈奋斗!
    -------------------------------------
  • 相关阅读:
    Git 基础
    SharePoint 2013 对象模型操作"网站设置"菜单
    SharePoint 2013 隐藏部分Ribbon菜单
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 设置自定义布局页
    SharePoint 2013 "通知我"功能简介
    SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
    SharePoint 禁用本地回环的两个方法
  • 原文地址:https://www.cnblogs.com/sjrb/p/10313436.html
Copyright © 2011-2022 走看看