洛谷P1074 靶形数独(跳舞链)
传送门
坑着,等联赛之后再填(联赛挂了就不填了233)
1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;} 9 inline int read(){ 10 #define num ch-'0' 11 char ch;bool flag=0;int res; 12 while(!isdigit(ch=getc())) 13 (ch=='-')&&(flag=true); 14 for(res=num;isdigit(ch=getc());res=res*10+num); 15 (flag)&&(res=-res); 16 #undef num 17 return res; 18 } 19 int score[100]={0,6,6,6,6,6,6,6,6,6, 20 21 6,7,7,7,7,7,7,7,6, 22 23 6,7,8,8,8,8,8,7,6, 24 25 6,7,8,9,9,9,8,7,6, 26 27 6,7,8,9,10,9,8,7,6, 28 29 6,7,8,9,9,9,8,7,6, 30 31 6,7,8,8,8,8,8,7,6, 32 33 6,7,7,7,7,7,7,7,6, 34 35 6,6,6,6,6,6,6,6,6}; 36 const int N=9,mm=N*N*N*N*N*4+N,mn=N*N*N+N; 37 int mp[10][10]; 38 int ans=-1,sz; 39 int U[mm],D[mm],L[mm],R[mm],C[mm],X[mm]; 40 int S[mn],Q[mn],H[mn];bool v[mn]; 41 void init(int r,int c){ 42 //建好虚拟节点 43 for(int i=0;i<=c;++i){ 44 S[i]=0,U[i]=D[i]=i, 45 L[i+1]=i,R[i]=i+1; 46 } 47 R[sz=c]=0,L[0]=sz; 48 while(r) H[r--]=-1;//判断每列是否有节点 49 } 50 void place(int &r,int &c1,int &c2,int &c3,int &c4,int i,int j,int k){ 51 //看不懂 52 r=((i-1)*N+j-1)*N+k; 53 c1=(i-1)*N+j; 54 c2=N*N+(i-1)*N+k; 55 c3=N*N*2+(j-1)*N+k; 56 c4=N*N*3+(((i-1)/3)*3+(j-1)/3)*N+k; 57 } 58 void link(int r,int c){ 59 //S记录每列的元素个数,C是个队列,记录总的节点个数(大概) 60 //好像看不太懂这跳舞链怎么连的…… 61 ++S[C[++sz]=c]; 62 X[sz]=r,D[sz]=D[c],U[D[c]]=sz, 63 U[sz]=c,D[c]=sz; 64 if(H[r]==-1) H[r]=L[sz]=R[sz]=sz;//这行没有的话就都先连起来 65 else{ 66 R[sz]=R[H[r]],L[R[H[r]]]=sz, 67 L[sz]=H[r],R[H[r]]=sz; 68 } 69 } 70 void remove(int c){ 71 L[R[c]]=L[c],R[L[c]]=R[c]; 72 for(int i=D[c];i!=c;i=D[i]) 73 for(int j=R[i];j!=i;j=R[j]) 74 D[U[j]]=D[j],U[D[j]]=U[j],--S[C[j]]; 75 } 76 void resume(int c){ 77 for(int i=U[c];i!=c;i=U[i]) 78 for(int j=L[i];j!=i;j=L[j]) 79 ++S[C[D[U[j]]=U[D[j]]=j]]; 80 L[R[c]]=R[L[c]]=c; 81 } 82 void dance(int k){ 83 if(!R[0]){ 84 int res=0; 85 for(int i=0;i<k;++i) 86 res+=score[(X[Q[i]]-1)/N+1]*((X[Q[i]]-1)%N+1); 87 cmax(ans,res); 88 return; 89 } 90 int tmp=mm,c; 91 for(int i=R[0];i;i=R[i]) 92 if(S[i]<tmp) tmp=S[c=i]; 93 remove(c); 94 for(int i=D[c];i!=c;i=D[i]){ 95 Q[k]=i; 96 for(int j=R[i];j!=i;j=R[j]) remove(C[j]); 97 dance(k+1); 98 for(int j=L[i];j!=i;j=L[j]) resume(C[j]); 99 } 100 resume(c); 101 } 102 int main(){ 103 // freopen("testdata.in","r",stdin); 104 int r,c1,c2,c3,c4; 105 init(mn,N*N*4); 106 for(int i=1;i<=N;++i) 107 for(int j=1;j<=N;++j){ 108 mp[i][j]=read(); 109 if(mp[i][j]){ 110 place(r,c1,c2,c3,c4,i,j,mp[i][j]); 111 link(r,c1),link(r,c2),link(r,c3),link(r,c4); 112 v[c1]=v[c2]=v[c3]=v[c4]=1; 113 } 114 } 115 for(int i=1;i<=N;++i) 116 for(int j=1;j<=N;++j) 117 for(int k=1;k<=N;++k){ 118 place(r,c1,c2,c3,c4,i,j,k); 119 if(v[c1]||v[c2]||v[c3]||v[c4])continue; 120 link(r,c1),link(r,c2),link(r,c3),link(r,c4); 121 } 122 dance(0); 123 printf("%d\n",ans); 124 return 0; 125 }
转载于:https://www.cnblogs.com/bztMinamoto/p/9670705.html
洛谷P1074 靶形数独(跳舞链)相关推荐
- 洛谷 P1074 靶形数独
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- [洛谷P1074] 靶形数独
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 洛谷 P1074靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的&q ...
- 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 靶形数独(洛谷-P1074)
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的&q ...
- 洛谷题目---P1784 数独
题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无 ...
- 专题·树链剖分【including 洛谷·【模板】树链剖分
初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...
最新文章
- 无人驾驶定位与贝叶斯滤波
- 2--mkdir命令
- C语言实现UDP网络通信(附服务端和客服端完整源码)
- 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》目录—导读
- [导入]Gemini翻譯為中文時的注意事項
- Spring Cloud 入门 之 Feign 篇(三)
- go 链路追踪_使用opentracing,jaeger实现golang链路追踪
- SQL 全文索引 CONTAINS
- AI主播首次上岗CCTV,撒贝宁有了个虚拟孪生兄弟“小小撒”
- 洛谷—— P2658 汽车拉力比赛
- html+css改字体,css怎么改字体样式?
- bt文件如何找到资源服务器,如何用Folx创建种子分享自己的文件资源
- php k线公式源码,发个珍藏了N久的波浪主图公式(公式 指标 源码)(演示图)-其他软件公式 -程序化交易(CXH99.COM)...
- 图片alt标签是什么?如何优化Alt标签
- 开源WPF第三方库【Newbeecoder.UI】分页控件
- Notepad++软件安装教程
- 学生用计算机重启,学生用计算器咋关机
- javaWeb(b站狂神说)
- sql server 系统表 介绍
- cs python课程 加州大学_如何看待Berkeley开设的CS61A:SICP in Python课程?
热门文章
- Linux下gdb attach的使用(调试已在运行的进程)
- 澳洲计算机学,2020年澳洲计算机科学专业工作好找吗
- shell python优势_python的优势
- coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...
- 网络新手ip隐藏器_动态IP代理的用途
- js增加属性_前端js基础2
- OpenCV-Java版学习(1.在IDEA中使用OpenCV)
- Java学习总结:28
- Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换
- python3.7.4安装教程桌面_Python 3.7.4 for Windows的安装