Live2D

[题解]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\n",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\n");
}

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\n");
            continue;
        }
        bfs();
    }
    return 0;
}

 

posted @ 2019-01-24 11:25  SHGEEK  阅读(232)  评论(0编辑  收藏  举报