题目大意:

9宫格每个位置都有对应的分数,填完数独后根据对应位置的分数相加之和求个最大值,不存在输出-1

说什么用位运算加速可以解决问题,但是对着标程还是T,最近学了dlx,发现这样解决数独快了很多

位运算加速我确实写不出了,直接用dlx来做这道题目

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <climits>
#include <cmath> using namespace std;
#define N 1000
#define MAXNODE 1000000
const int INF = INT_MAX;
const double eps = 1e-; int a[][];
char str[]; int belong[][] = {
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
};
int sc[][] = {
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
}; void printM()
{
for(int i= ; i< ; i++)
for(int j= ; j< ; j++){
if(j<) printf("%d " , a[i][j]);
else printf("%d\n" , a[i][j]);
}
} struct DLX{
int n ,m , size;
int col[MAXNODE] , row[MAXNODE];
int U[MAXNODE] , D[MAXNODE] , L[MAXNODE] , R[MAXNODE];
int cnt_col[N] , first[N];
int ans[] , minv; void init(int _n , int _m)
{
n = _n , m = _m;
size= m ;
for(int i= ; i<=m ; i++){
L[i] = i- , R[i] = i+;
U[i] = D[i] = i;
}
L[] = m , R[m] = ;
for(int i= ; i<=m ; i++) cnt_col[i] = ;
for(int i= ; i<=n ; i++) first[i] = -;
minv = ;
} void link(int r , int c)
{
++size;
U[D[c]] = size , D[size] = D[c];
U[size] = c , D[c] = size; if(first[r]<) L[size]=R[size]=first[r] = size;
else{
L[R[first[r]]] = size , R[size] = R[first[r]];
L[size] = first[r] , R[first[r]] = size;
}
row[size] = r , col[size] = c , cnt_col[c]++;
} void Remove(int c)
{
L[R[c]] = L[c] , R[L[c]] = R[c];
for(int i=D[c] ; i!=c ; i=D[i]){
for(int j=R[i] ; j!=i ; j=R[j]){
U[D[j]] = U[j] , D[U[j]] = D[j];
cnt_col[col[j]]--;
}
}
} void Resume(int c)
{
for(int i=U[c] ; i!=c ; i=U[i]){
for(int j=L[i] ; j!=i ; j=L[j]){
U[D[j]] = D[U[j]] = j;
cnt_col[col[j]]++;
}
}
// printM();
L[R[c]] = R[L[c]] = c;
} void Dance(int d)
{
if(!R[]){
int v = ;
for(int i= ; i<d ; i++){
int r = (ans[i]-)/;
int c = ((ans[i]-)%)/;
a[r][c] = ((ans[i]-)%)+;
v+=a[r][c]*sc[r][c];
}
minv=max(minv , v);
return;
}
int st=R[];
for(int i=R[] ; i!= ; i=R[i])
if(cnt_col[i]<cnt_col[st])
st = i;
Remove(st);
for(int i=D[st] ; i!=st ; i=D[i]){
ans[d] = row[i];
for(int j=R[i] ; j!=i ; j=R[j]) Remove(col[j]);
Dance(d+);
for(int j=L[i] ; j!=i ; j=L[j]) Resume(col[j]);
}
Resume(st);
return ;
} }dlx; int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
for(int i= ; i< ; i++){
for(int j= ; j< ; j++){
scanf("%d" , &a[i][j]);
}
}
dlx.init( , );
for(int i= ; i< ; i++)
for(int j= ; j< ; j++)
{
if(a[i][j]){
dlx.link((i*+j)*+a[i][j] , i*+a[i][j]);
dlx.link((i*+j)*+a[i][j] , +j*+a[i][j]);
dlx.link((i*+j)*+a[i][j] , +(belong[i][j]-)*+a[i][j]);
dlx.link((i*+j)*+a[i][j] , +i*+j+);
}
else{
for(int k= ; k<= ; k++){
dlx.link((i*+j)*+k , i*+k);
dlx.link((i*+j)*+k , +j*+k);
dlx.link((i*+j)*+k , +(belong[i][j]-)*+k);
dlx.link((i*+j)*+k , +i*+j+);
}
}
}
dlx.Dance();
if(!dlx.minv) puts("-1");
else printf("%d\n" , dlx.minv);
} return ;
}

CSU 1605 数独的更多相关文章

  1. LintCode389.判断数独是否合法

    LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...

  2. [LeetCode] Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. [LeetCode] Valid Sudoku 验证数独

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  4. 数独 JAVA实现

    数独游戏的规则从很久之前就知道,但是一直都没怎么玩过,然后到了大学,大一下学期自己学dfs的时候,刚刚好碰到了一个数独的题目,做出来后,感觉还是挺有成就感的 然后大二学了JAVA,看了下那个一些有关于 ...

  5. 用C++实现的解数独(Sudoku)程序

    我是一个C++初学者,控制台实现了一个解数独的小程序. 代码如下: //"数独游戏"V1.0 //李国良于2016年11月11日编写完成 #include <iostream ...

  6. ACM : POJ 2676 SudoKu DFS - 数独

    SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Descr ...

  7. ACM: ICPC/CCPC Sudoku DFS - 数独

    Sudoku Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/65535K (Java/Other) Total Submis ...

  8. codevs 2924 数独挑战

    2924 数独挑战 http://codevs.cn/problem/2924/ 题目描述 Description "芬兰数学家因卡拉,花费3个月时间设计出了世界上迄今难度最大的数独游戏,而 ...

  9. 用html5 canvas和JS写个数独游戏

    为啥要写这个游戏? 因为我儿子二年级数字下册最后一章讲到了数独.他想玩儿. 因为我也想玩有提示功能的数独. 因为我也正想决定要把HTML5和JS搞搞熟.熟悉一个编程平台,最好的办法,就是了解其原理与思 ...

随机推荐

  1. PHP的知识点总结1

    PHP 基础知识总结 2015-06-03 分类: 编程技术   PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本.HTML.JavaScript代码和 P ...

  2. 【学习笔记】深入理解js原型和闭包(10)——this

    接着上一节讲的话,应该轮到“执行上下文栈”了,但是这里不得不插入一节,把this说一下.因为this很重要,js的面试题如果不出几个与this有关的,那出题者都不合格. 其实,this的取值,分四种情 ...

  3. ArcGIS Desktop新建postgresql版sde(10.4.1)的连接

    假设连接到的sde数据库是pg数据库,其他参数包括: ip:10.0.0.8 数据库:sde1 用户:sde 密码:sde 打开catalog,新建数据库连接 按如下输入数据库连接参数 红框1是数据库 ...

  4. 6 Specialzed layers 特殊层 第二部分 读书笔记

    CAGradientLayer   CAGradientLayer is used to generate a smooth gradient between two or more colors. ...

  5. SQL Server时间类型datetime

    SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...

  6. 设置QtreeWidget水平滚动条

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7552603.html //设置treewidget水平滚动条 ui.treeWidget->header ...

  7. 洛谷 P1955 程序自动分析

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

  8. JVM_Bind问题的解决方案

    心得:删除javaw.exe进程即可. 以下是网络的解决方案: JVM_Bind问题出现通常有两种情况. 一种是原来的javaw.exe没有结束掉而又新创建了一个javaw.exe进程.这本无可厚非, ...

  9. dig - 发送域名查询信息包到域名服务器

    SYNOPSIS(总览) dig [@ server ] domain [Aq query-type ] [Aq query-class ] [+ Aq query-option ] [-Aq dig ...

  10. win10下安装使用mysql-5.7.23-winx64

    下载MySQLhttps://dev.mysql.com/downloads/file/?id=478884 解压到文件,此例为D盘根目录 在mysql-5.7.23-winx64目录下创建[my.i ...