CSU 1605 数独
题目大意:
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 数独的更多相关文章
- LintCode389.判断数独是否合法
LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...
- [LeetCode] Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- [LeetCode] Valid Sudoku 验证数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 数独 JAVA实现
数独游戏的规则从很久之前就知道,但是一直都没怎么玩过,然后到了大学,大一下学期自己学dfs的时候,刚刚好碰到了一个数独的题目,做出来后,感觉还是挺有成就感的 然后大二学了JAVA,看了下那个一些有关于 ...
- 用C++实现的解数独(Sudoku)程序
我是一个C++初学者,控制台实现了一个解数独的小程序. 代码如下: //"数独游戏"V1.0 //李国良于2016年11月11日编写完成 #include <iostream ...
- ACM : POJ 2676 SudoKu DFS - 数独
SudoKu Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu POJ 2676 Descr ...
- ACM: ICPC/CCPC Sudoku DFS - 数独
Sudoku Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/65535K (Java/Other) Total Submis ...
- codevs 2924 数独挑战
2924 数独挑战 http://codevs.cn/problem/2924/ 题目描述 Description "芬兰数学家因卡拉,花费3个月时间设计出了世界上迄今难度最大的数独游戏,而 ...
- 用html5 canvas和JS写个数独游戏
为啥要写这个游戏? 因为我儿子二年级数字下册最后一章讲到了数独.他想玩儿. 因为我也想玩有提示功能的数独. 因为我也正想决定要把HTML5和JS搞搞熟.熟悉一个编程平台,最好的办法,就是了解其原理与思 ...
随机推荐
- 为页面添加favicon
<link rel="shortcut icon" href="favicon.ico" /> 还有另一种写法,但是IE对它的支持不够好: < ...
- redirect与forward的区别
文件名称:forward.jsp <html> <head><title> 跳转 </title> </head> <body> ...
- UVALive - 6428(扩展欧几里德)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=48388 前段时间偶然碰到的一道题,今天突然想到没把它记录下来. 比较不错的扩 ...
- android开发学习 ------- json数据与实体类之间的相互转换
在网络请求的时候,会返回给我们实体类,我们需要将实体类转化为json字符串,方便处理数据: 有时候也会将json数据转换为实体类. 在Android Studio中,json要互相转换,需要用到gso ...
- 《Redis开发与运维》快速笔记(一)
1.前言&基本介绍 在原始的系统架构中,我们都由程序直接连接DB,随着业务的进一步开展,DB的压力越来越大,为了缓解DB的这一压力,我们引入了缓存,在程序连接DB中加入缓存层, 从而减轻数据库 ...
- 基于Java实现的冒泡排序算法
冒泡排序是一种简单基础的排序算法,相信在大学课堂里老师已经讲过了,现在我基于Java来实现一遍. 简述 冒泡排序正如其关键词一样,杂乱的气泡经过浮动,最后大的气泡飘到了上面而小的气泡在下面,无序的元素 ...
- AJPFX总结集合的概念
//java 中集合的概述========================================================== 集合的概念: 为 ...
- InvocationTargetException异常的深入研究-servlet的setAttribute与getAttribute
在某项目中,前端jsp传入的用户id数据通过session域传入后台servlet进行处理的过程中,无意间出现了InvocationTargetException异常 前端部分代码如下:测试代码,非原 ...
- flask_SQLAlchemy 中常用的过滤和执行器
常用的SQLAlchemy查询过滤器 过滤器 说明 filter() 把过滤器添加到原查询上,返回一个新查询 filter_by() 把等值过滤器添加到原查询上,返回一个新查询 limit 使用指定的 ...
- 中位数II
该题目与思路分析来自九章算法的文章,仅仅是自己做个笔记! 题目:数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. 解答: 这道题是用堆解决的问题.用两个堆,max he ...