传送门

坑着,等联赛之后再填(联赛挂了就不填了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 靶形数独(跳舞链)相关推荐

  1. 洛谷 P1074 靶形数独

    P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士 ...

  2. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  3. [洛谷P1074] 靶形数独

    洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...

  4. 洛谷 P1074 靶形数独 Label:search 不会

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  5. 洛谷 P1074靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的&q ...

  6. 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  7. 靶形数独(洛谷-P1074)

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的&q ...

  8. 洛谷题目---P1784 数独

    题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无 ...

  9. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

最新文章

  1. 无人驾驶定位与贝叶斯滤波
  2. 2--mkdir命令
  3. C语言实现UDP网络通信(附服务端和客服端完整源码)
  4. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》目录—导读
  5. [导入]Gemini翻譯為中文時的注意事項
  6. Spring Cloud 入门 之 Feign 篇(三)
  7. go 链路追踪_使用opentracing,jaeger实现golang链路追踪
  8. SQL 全文索引 CONTAINS
  9. AI主播首次上岗CCTV,撒贝宁有了个虚拟孪生兄弟“小小撒”
  10. 洛谷—— P2658 汽车拉力比赛
  11. html+css改字体,css怎么改字体样式?
  12. bt文件如何找到资源服务器,如何用Folx创建种子分享自己的文件资源
  13. php k线公式源码,发个珍藏了N久的波浪主图公式(公式 指标 源码)(演示图)-其他软件公式 -程序化交易(CXH99.COM)...
  14. 图片alt标签是什么?如何优化Alt标签
  15. 开源WPF第三方库【Newbeecoder.UI】分页控件
  16. Notepad++软件安装教程
  17. 学生用计算机重启,学生用计算器咋关机
  18. javaWeb(b站狂神说)
  19. sql server 系统表 介绍
  20. cs python课程 加州大学_如何看待Berkeley开设的CS61A:SICP in Python课程?

热门文章

  1. Linux下gdb attach的使用(调试已在运行的进程)
  2. 澳洲计算机学,2020年澳洲计算机科学专业工作好找吗
  3. shell python优势_python的优势
  4. coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...
  5. 网络新手ip隐藏器_动态IP代理的用途
  6. js增加属性_前端js基础2
  7. OpenCV-Java版学习(1.在IDEA中使用OpenCV)
  8. Java学习总结:28
  9. Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换
  10. python3.7.4安装教程桌面_Python 3.7.4 for Windows的安装