DLX板子(struct)

2023-11-01 01:48
文章标签 struct 板子 dlx

本文主要是介绍DLX板子(struct),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仿照刘汝佳的板子写的OI用板子
与工程代码还是格格不入的
仅供学习参考

template <int node_num> struct DLX {int cn, nn; //col_num, node_numint S[node_num]; //node_num in a col, it wastes memint ansd, ans[node_num]; //it also wastes mem//node infoint row[node_num], col[node_num];int L[node_num], R[node_num], U[node_num], D[node_num];void init(int col_n) {cn = col_n;for(int i = 0;i <= cn;i++) {U[i] = D[i] = i;L[i] = i - 1; R[i] = i + 1;} L[0] = cn; R[cn] = 0; //turn to circlenn = cn + 1;memset(S, 0, sizeof(S));}void addrow(int r, int a[], int n) {int pre = nn;for(int i = 0;i < n;i++) {int c = a[i];D[nn] = c; U[nn] = U[c];L[nn] = nn - 1; R[nn] = nn + 1;D[U[c]] = nn; U[c] = nn;row[nn] = r; col[nn] = c;S[c]++; nn++;} L[pre] = nn - 1; R[nn - 1] = pre;}#define FOR(i, A, x) for(int i = A[x];i != x;i = A[i])void remove(int c) {L[R[c]] = L[c]; R[L[c]] = R[c];FOR(i, D, c)FOR(j, R, i) {U[D[j]] = U[j]; D[U[j]] = D[j]; S[col[j]]--;}}void restore(int c) {FOR(i, U, c)FOR(j, L, i) {U[D[j]] = D[U[j]] = j;S[col[j]]++;}L[R[c]] = R[L[c]] = c;}inline bool end(int d) {//to rewritereturn R[0] == 0;} bool dfs(int d) {if(end(d)) {ansd = d;return 1;}int c = R[0];FOR(i, R, 0) if(S[i] < S[c]) c = i;remove(c);FOR(i, D, c) {ans[d] = row[i];FOR(j, R, i) remove(col[j]);if(dfs(d + 1)) return 1;FOR(j, L, i) restore(col[j]);}restore(c);return 0;}bool solve() { return dfs(0); }#undef FORDLX (int col_num) { init(col_num); }
};

这篇关于DLX板子(struct)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319614

相关文章

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

Linux block_device gendisk和hd_struct到底是个啥关系

本文的源码版本是Linux 5.15版本,有图有真相: 1.先从块设备驱动说起 安卓平台有一个非常典型和重要的块设备驱动:zram,我们来看一下zram这个块设备驱动加载初始化和swapon的逻辑,完整梳理完这个逻辑将对Linux块设备驱动模型有深入的理解。 zram驱动加载的时候会调用zram_add函数,源码如下: 1887/*1888 * Allocate and initia

浅析c/c++中 struct的区别

(1)C的struct与C++的class的区别。 (2)C++中的struct和class的区别。 在第一种情况下,struct与class有着非常明显的区别。C是一种过程化的语言,struct只是作为一种复杂数据类型定义,struct中只能定义成员变量,不能定义成员函数(在纯粹的C语言中,struct不能定义成员函数,只能定义变量)。例如下面的C代码片断: 复制代码代码如下:

在嵌入式板子上搭建和自定义live555服务器---编译问题和方法整理

live555 官方网站 点我直达,live555是一个简单的专注于实现RTSP服务器的开源库。它自带解析H264 H265 mp3等源的API,有一个简单的推流文件参考RTSP服务器例程testH264VideoStreamer也有官方实现的LIVE555 Media Server。无论是命令行使用还是用API实现定制需求是很方便的。 图龙宝刀点击下载 文章目录 live555

c++ error: redefinition of ‘struct ac::bd’ struct ac::bd:fg

#include <iostream> #include <stdio.h> class ac {     public:         class bd; }; class ac::bd {     public:         struct fg; }; struct ac::bd:fg {     int a = 1; }; int main() {     return 0;

Go-struct嵌套初始化与赋值

struct嵌套的几种用法。 示例一 package mainimport "fmt"import "encoding/json"type Point struct {X, Y int}type Circle struct {Center PointRadius int}type Wheel struct {Circle CircleSpokes int}func foo() {var

golang 结构体struct、数组、结构体数组 定义与赋值 、json string转struct

文章目录 1.结构体struct1.1 声明结构体1.2 初始化结构体 以及 传参 2. 结构体数组、append3. 接口返回 含数组的结构体 常用写法json string转struct 1.结构体struct 看这个文章,看一个struct 1.1 声明结构体 // studenttype Student struct {Name stringAge uint64

Unity3D DOTS系列之Struct Change核心机制详解

前言 在Unity3D的DOTS(Data-Oriented Technology Stack)体系中,Struct Change是一个核心的内存管理机制,它涉及对Entity和Component数据的重新排列和内存分配。DOTS通过ECS(Entity Component System)模型,将游戏中的对象(Entity)、属性(Component)和行为(System)分离,以数据驱动的方式

c++ struct结构体的用法

在 C++ 中,struct(结构体)是一种用户自定义的数据类型,可以用来组合不同类型的数据。结构体的使用非常广泛,尤其在需要将多个相关的数据组合在一起时。 定义结构体 使用 struct 关键字定义一个结构体的基本语法如下: struct StructName {// 数据成员DataType member1;DataType member2;// ...}; 示例 下面是一个简单

c语言:typedef + struct + 指针

c语言规范,定义结构体: typedef  struct ANSWER_HEADER { u8 u8Type; u8 u8Code; u32 u32TimeStamp; struct ANSWER_HEADER *pNext; }ANSWER_HEADER_T, *PANSWER_HEADER_T;   ANSWER_HEADER为结构名,这个名字主要是为了在结构体中包含自己为成