首页 > 其他分享 >题解 P7724 【远古档案馆(Ancient Archive)】

题解 P7724 【远古档案馆(Ancient Archive)】

时间:2022-11-10 09:36:31浏览次数:78  
标签:node begin Ancient return int 题解 P7724 include

posted on 2021-07-14 19:19:57 | under 题解 | source

首先我们先算一下网格最多可能有多少种状态,很显然是 \(5^4=625\),完全可以暴力搜索。

那怎么实现呢?可以使用 bfs,以初始状态开始,每次找空格子,将空格子四周的数字移过来,完成状态的扩展。

但这样子极有可能重复搜索同一种状态,我们需要去重。经测试使用 std::map 会 MLE/TLE,所以我们使用 hash。观察到题面有一句话:

且它们就是前 \(\bold{k}\) 个不同的正整数

换句话说,数字全都是一位数,可以把四个数字压缩成一个四位数,这样就不会 MLE/TLE 了。

这里给出我的代码实现:

#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int dx[]={0,-1,0,0,1},
          dy[]={0,0,-1,1,0};
int n=2;
struct node{
    int a[3][3];
    friend istream& operator>>(istream &fin,node &e){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                fin>>e.a[i][j];
            }
        }
        return fin;
    }
    operator int(){
        return a[1][1]*1
              +a[1][2]*10
              +a[2][1]*100
              +a[2][2]*1000;
    }
};
queue<node> q;
bool vis[10010];
node begin,end;
bool bfs(){
    vis[begin]=1;
    q.push(begin);
    while(!q.empty()){
        node now=q.front();q.pop();
        if(now==end) return 1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(now.a[i][j]==0){
                    for(int k=1;k<=4;k++){
                        int x=i+dx[k],y=j+dy[k];
                        if(1<=x&&x<=n&&1<=y&&y<=n&&now.a[x][y]!=0){
                            node pus=now;
                            swap(pus.a[i][j],pus.a[x][y]);
                            if(!vis[pus]){
                                vis[pus]=1;
                                q.push(pus);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}
int main(){
    cin>>begin>>end;
    cout<<(bfs()?"Yes":"No")<<endl;
    return 0;
}

标签:node,begin,Ancient,return,int,题解,P7724,include
From: https://www.cnblogs.com/caijianhong/p/solution-P7724.html

相关文章

  • 题解 P7775 【[COCI 2009-2010 #2] VUK】
    postedon2021-08-0316:20:45|under题解|sourcebfs+二分。首先算出一个数组\(w_{i,j}\),表示\((i,j)\)这个格子与离它最近的树的距离。这个过程可以参考P133......
  • 题解 P2482 【[SDOI2010]猪国杀】
    postedon2021-04-1619:58:01|under题解|source想看代码的直接跳Day6这题不能发题解,所以这是做题记录做题原因:499AC,教练推荐我切这题遗言前言:早就听说了这个......
  • P2474 题解
    前言题目传送门!更好的阅读体验?差分约束。思路预处理维护两个数组\(mn_{i,j}\)与\(mx_{i,j}\),表示砝码\(i\)与砝码\(j\)重量差值的最小最大。我们分类讨论:......
  • LeetCode 题解 394. 字符串解码
    题目描述给定一个经过编码的字符串,返回它解码后的字符串。编码规则为:k[encoded_string],表示其中方括号内部的encoded_string正好重复k次。注意k保证为正整数。......
  • 题解 LGP7071 【 [CSP-J2020] 优秀的拆分】
    postedon2020-11-1217:22:31|under题解|source本题正解是二进制or位运算理解题目P7071优秀的拆分(民间数据)题目链接:https://www.luogu.com.cn/problem......
  • 题解 LGP7909 【[CSP-J 2021] 分糖果】
    postedon2021-10-2322:52:47|under题解|source分类讨论。一句话题意:求\(\max\limits_{i=l}^{r}\{i\bmodn\}\)首先画个数轴,按除以\(n\)向下取整的商把这些整......
  • 题解 LGP8819【[CSP-S 2022] 星战】
    postedon2022-10-3011:39:14|under题解|sourceproblem一个\(n\)个点\(m\)条边的有向图,\(q\)次操作:删除一条边,保证存在;增加一条边,保证不存在;删除一个点......
  • 题解 LGP8817【[CSP-S 2022] 假期计划】
    postedon2022-10-2923:32:15|under题解|sourceproblem\(n\)个点\(m\)条边的无向无权图,令\(to(i,j)=[\operatorname{dist}(i,j)\leqk+1]\),点带权\(a_i\),求:......
  • 题解 LGP7343【[DSOI 2021] 电子跃迁】
    postedon2021-02-0718:12:18|under题解|source题意简述给出一长为\(n\)的数列\(a\)和一长为\(m\)的数列\(b\),你可以交换\((a_i,a_{i+1})\)的位置,但不能......
  • 题解 AGC033D【Complexity】
    problem定义一个0/1矩阵\(B\)的复杂度为:若\(B\)只由一种数字组成,其复杂度为\(0\)。否则,用一条平行于矩阵\(B\)任意一边的直线将\(B\)划分为两部分,则复杂度......