首页 > 其他分享 >abc332D 将矩阵A变成B的最小步数

abc332D 将矩阵A变成B的最小步数

时间:2024-03-08 12:33:05浏览次数:22  
标签:const abc332D int hval rep 矩阵 cin bfs 步数

题面:给定两个H行W列的矩阵A和B,每次操作可以交换相邻的行或列,问是否可以将A变成B?如果可以,输出最少操作步数;如果不行,输出-1。
范围:2<=H,W<=5, 1<=A[i][j],B[i][j]<=1e9

思路:数据规模小,直接bfs搜索,如果范围再大点可以用双向bfs优化效率。需要用到哈希来快速判重。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

using hval = tuple<int,int,int>;
const int B1 = 131, M1 = 1000000123;
const int B2 = 137, M2 = 1000000223;
const int B3 = 139, M3 = 1000000007;

const int N = 6;
using Arr = array<array<int,N>,N>;
int H, W;
Arr A, B;
hval HB;
set<hval> vis;

hval encode(Arr a) {
    int x = 0, y = 0, z = 0;
    rep(i,1,H) rep(j,1,W) {
        x = (x * B1 + a[i][j]) % M1;
        y = (y * B2 + a[i][j]) % M2;
        z = (z * B3 + a[i][j]) % M3;
    }
    return {x,y,z};
}

void bfs() {
    HB = encode(B);
    queue<tuple<Arr,hval,int>> q;
    hval HA = encode(A);
    q.push({A,HA,0}); vis.insert(HA);
    while (!q.empty()) {
        auto [t,h,d] = q.front(); q.pop();
        if (h == HB) {
            cout << d << "\n";
            return;
        }
        rep(i,1,H-1) {
            Arr x = t;
            rep(j,1,W) swap(x[i][j], x[i+1][j]);
            hval hx = encode(x);
            if (vis.count(hx) == 0) {
                q.push({x,hx,d+1}); vis.insert(hx);
            }
        }
        rep(j,1,W-1) {
            Arr x = t;
            rep(i,1,H) swap(x[i][j], x[i][j+1]);
            hval hx = encode(x);
            if (vis.count(hx) == 0) {
                q.push({x,hx,d+1}); vis.insert(hx);
            }
        }
    }
    cout << -1 << "\n";
}
void solve() {
    cin >> H >> W;
    rep(i,1,H) rep(j,1,W) cin >> A[i][j];
    rep(i,1,H) rep(j,1,W) cin >> B[i][j];
    bfs();
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:const,abc332D,int,hval,rep,矩阵,cin,bfs,步数
From: https://www.cnblogs.com/chenfy27/p/18060737

相关文章

  • C++中OpenCV、Armadillo矩阵数据格式的转换方式
      本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法。  在C++语言的矩阵库Armadillo与计算机视觉库OpenCV中,都有矩阵格式的数据类型;而这两个库在运行能力方面各有千秋,因此实际应用过程中,难免会遇到需要将二者的矩阵格......
  • 代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋
    977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/description/publicstaticint[]sortedSquares(int[]nums){intleft=0;intright=nums.length-1;int[]result=newint[nums.length];intwrite=......
  • 矩阵乘法
    GEMM(GeneralMatrixMultiplication)-通用矩阵乘BLAS(BasicLinearAlgebraSubprograms)-基本线性代数子程序SGEMM(SingleprecisionGeneralMatrixMultiply)-单精度矩阵乘法DGEMM(DoubleprecisionGeneralMatrixMultiply)-双精度矩阵乘法CGEMM(Complexsingl......
  • MySQL 从库同步数据报错: Can't find record in '表名', Error_code: 1032; handler er
    由于两边数据不一致,主库host表的某条数据在从库不存在,导致同步时执行update报错。 修复的原理很简单,找到主从不一致的这条数据,在从库补上,让update能执行就好。由于需要从binlog里找数据,需要确保中断之后的binlog没被删除,否则就只能重搭了。导出日志:mysqlbinlog-v--stop-po......
  • matlab教程_台大lecture1基本操作和矩阵输入
    matlab教程视频matlabascalculatorcommendline直接用命令行计算部分ans是结果运算法则和平时一样((),^乘除加减)onlinehelpeg:helpsin&直接搜索嵌套式公式sin(cos(pi))==cos(pi)sin(ans)其中,ans是第一个的结果变量可以用who查看变量,whos详细信息一些保留......
  • 矩阵快速幂
    对于矩阵快速幂,其作用能够达到快速递推公式的作用这里先定义一个矩阵structmartix{intx[105][105];martix(){memset(x,0,sizeofx);}};首先看如何进行矩阵计算,由线性代数知:martixcacl(martixa,martixb){martixc;for(inti=1;i<=n;i++)......
  • 最大字段和,区间矩阵
    最大字段和原题链接:P1115最大子段和-洛谷|计算机科学教育新生态(luogu.com.cn)解析:经典动态规划:最大子数组问题-知乎(zhihu.com)我写的代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],dp[N]......
  • 邻接矩阵 存储图
    存储图可以用邻接表和邻接矩阵以下代码来自https://www.acwing.com/blog/content/405///对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点inth[N],e[N],ne[N],idx,w[N];//添加一条边a->b,权重是wvoidadd(inta,intb,intw){e[id......
  • 矩阵爆破逆向之条件断点的妙用
    不知道你是否使用过IDA的条件断点呢?在IDA进阶使用中,它的很多功能都有大作用,比如:ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大,配合IDA-python的输出语句能够大杀特杀!那么本文就介绍一下这个功能点,使用z3来秒解题目。条件断点什么是条件断点呢?条件断点(ConditionalBrea......
  • SDOI2014重建-矩阵树定理、概率
    link:https://www.luogu.com.cn/problem/P3317给一张无向图,每条边有一定概率连通,问整张图恰好构成一棵\(n\)个点的树的概率。输出实数。\(1<n\leq50\)这种问题通常会试着写出来:\[ans=\sum_{T}(\prod_{e\inT}p_e)(\prod_{e\not\inT}(1-p_e))=\prod_{e\inE}(1-p_e)\su......