思路:做法与9*9的一样。只不过是变量。

  1. #include<set>
  2. #include<map>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. #define pb push_back
  13. #define mp make_pair
  14. #define Maxn 4100
  15. #define Maxm 200010
  16. #define Y 1100
  17. #define LL __int645rssss
  18. #define Abs(x) ((x)>0?(x):(-x))
  19. #define lson(x) (x<<1)
  20. #define rson(x) (x<<1|1)
  21. #define inf 100000
  22. #define lowbit(x) (x&(-x))
  23. #define clr(x,y) memset(x,y,sizeof(x))
  24. #define Mod 1000000007
  25. using namespace std;
  26. int H[Maxn],R[Maxn*Y],L[Maxn*Y],D[Maxn*Y],U[Maxn*Y],Q[Maxn*Y],X[Maxn*Y],C[Maxn*Y],S[Maxn*Y];
  27. int cnt,n,g[][],id,N,num;
  28. void init(int n)
  29. {
  30. int i;
  31. for(i=;i<=n;i++){
  32. R[i]=i+;
  33. L[i+]=i;
  34. U[i]=D[i]=i;
  35. S[i]=;
  36. }
  37. clr(H,-);
  38. R[n]=;
  39. id=n+;
  40. }
  41. void ins(int r,int c)
  42. {
  43. U[id]=c;
  44. D[id]=D[c];
  45. U[D[c]]=id;
  46. D[c]=id;
  47. S[c]++;
  48. if(H[r]<)
  49. H[r]=R[id]=L[id]=id;
  50. else {
  51. R[id]=R[H[r]];
  52. L[id]=H[r];
  53. L[R[H[r]]]=id;
  54. R[H[r]]=id;
  55. }
  56. C[id]=c;
  57. X[id++]=r;
  58. }
  59. void Remove(int c)
  60. {
  61. R[L[c]]=R[c];
  62. L[R[c]]=L[c];
  63. for(int i=D[c];i!=c;i=D[i]){
  64. for(int j=R[i];j!=i;j=R[j]){
  65. D[U[j]]=D[j];
  66. U[D[j]]=U[j];
  67. S[C[j]]--;
  68. }
  69. }
  70. }
  71. void Resume(int c)
  72. {
  73. R[L[c]]=c;
  74. L[R[c]]=c;
  75. for(int i=D[c];i!=c;i=D[i]){
  76. for(int j=R[i];j!=i;j=R[j]){
  77. U[D[j]]=j;
  78. D[U[j]]=j;
  79. S[C[j]]++;
  80. }
  81. }
  82. }
  83. bool dfs(int step,int f)
  84. {
  85. int i,k,c,j,temp;
  86. temp=inf;
  87. if(R[]==) {
  88. num=step;
  89. if(cnt||f){
  90. cnt++;
  91. return true;
  92. }
  93. cnt++;
  94. return false;
  95. }
  96. for(i=R[];i;i=R[i]) if(S[i]<temp){
  97. temp=S[i];
  98. c=i;
  99. }
  100. Remove(c);
  101. for(i=D[c];i!=c;i=D[i]){
  102. Q[step]=X[i];
  103. for(j=R[i];j!=i;j=R[j]){
  104. Remove(C[j]);
  105. }
  106. if(dfs(step+,f))
  107. return true;
  108. for(j=L[i];j!=i;j=L[j]){
  109. Resume(C[j]);
  110. }
  111. }
  112. Resume(c);
  113. return false;
  114. }
  115. void build()
  116. {
  117. int i,j,k;
  118. int r,c;
  119. init(N*N*);
  120. for(i=;i<=N;i++){
  121. for(j=;j<=N;j++){
  122. if(g[i][j]){
  123. r=(i-)*N*N+(j-)*N+g[i][j];
  124. c=(i-)*N+g[i][j];
  125. ins(r,c);
  126. c=N*N+(j-)*N+g[i][j];
  127. ins(r,c);
  128. c=*N*N+(i-)*N+j;
  129. ins(r,c);
  130. c=*N*N+((i-)/n*n+(j+n-)/n-)*N+g[i][j];
  131. ins(r,c);
  132. }
  133. else{
  134. for(k=;k<=N;k++){
  135. r=(i-)*N*N+(j-)*N+k;
  136. c=(i-)*N+k;
  137. ins(r,c);
  138. c=N*N+(j-)*N+k;
  139. ins(r,c);
  140. c=*N*N+(i-)*N+j;
  141. ins(r,c);
  142. c=*N*N+((i-)/n*n+(j+n-)/n-)*N+k;
  143. ins(r,c);
  144. }
  145. }
  146. }
  147. }
  148. }
  149. void solve()
  150. {
  151. int i,j,k,r,c;
  152. cnt=;
  153. build();
  154. dfs(,);
  155. if(!cnt) {
  156. printf("No Solution\n");
  157. return;
  158. }
  159. if(cnt==){
  160. printf("Multiple Solutions\n");
  161. return;
  162. }
  163. for(i=;i<=N;i++){
  164. for(j=;j<=N;j++){
  165. if(!g[i][j]) continue;;
  166. c=g[i][j];
  167. g[i][j]=;
  168. cnt=;
  169. build();
  170. dfs(,);
  171. if(cnt<)
  172. break;
  173. g[i][j]=c;
  174. }
  175. if(j<=N) break;
  176. }
  177. if(i<=N){
  178. printf("Not Minimal\n");
  179. return;
  180. }
  181. cnt=;
  182. build();
  183. dfs(,);
  184. for(i=;i<num;i++){
  185. r=(Q[i]-)/(N*N)+;
  186. c=(Q[i]-(r-)*(N*N)-)/N+;
  187. k=(Q[i]-)%N+;
  188. g[r][c]=k;
  189. }
  190. for(i=;i<=N;i++){
  191. for(j=;j<=N;j++){
  192. if(g[i][j]<)
  193. printf("%d",g[i][j]);
  194. else{
  195. printf("%c",'A'+g[i][j]-);
  196. }
  197. }
  198. printf("\n");
  199. }
  200. }
  201. int main()
  202. {
  203. int i,j,k;
  204. char str[];
  205. while(scanf("%d",&n)!=EOF){
  206. clr(g,);
  207. N=n*n;
  208. for(i=;i<=N;i++){
  209. scanf("%s",str);
  210. for(j=;j<N;j++) if(str[j]!='.'){
  211. if(str[j]<=''&&str[j]>='')
  212. g[i][j+]=str[j]-'';
  213. else
  214. g[i][j+]=str[j]-'A'+;
  215. }
  216. }
  217. solve();
  218. }
  219. return ;
  220. }

hdu 3909 数独扩展的更多相关文章

  1. [2017BUAA软工]结对项目:数独扩展

    结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...

  2. HDU 3909 DLX

    http://blog.csdn.net/sr_19930829/article/details/39756513 http://www.kuangbin.net/archives/hdu4069-d ...

  3. HDU 2669 Romantic 扩展欧几里德---->解不定方程

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. hdu 6153 思维+扩展kmp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 扩展kmp不理解的看下:http://www.cnblogs.com/z1141000271/p ...

  5. HDU 2669 Romantic(扩展欧几里德, 数学题)

    题目 //第一眼看题目觉得好熟悉,但是还是没想起来//洪湖来写不出来去看了解题报告,发现是裸的 扩展欧几里得 - - /* //扩展欧几里得算法(求 ax+by=gcd )//返回d=gcd(a,b) ...

  6. hdu 5512 Pagodas 扩展欧几里得推导+GCD

    题目链接 题意:开始有a,b两点,之后可以按照a-b,a+b的方法生成[1,n]中没有的点,Yuwgna 为先手, Iaka后手.最后不能再生成点的一方输: (1 <= n <= 2000 ...

  7. HDU 1426(数独 DFS)

    题意是完成数独. 记录全图,将待填位置处填 0,记录下所有的待填位置,初始化结束.在每个待填位置处尝试填入 1 - 9,若经过判断后该位置可以填入某数字,则继续向下填下一个位置, 回溯时把待填位置重新 ...

  8. J - Clairewd’s message HDU - 4300(扩展kmp)

    题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...

  9. HDU - 5547 数独(回溯法)

    题目链接:HDU-5547 http://acm.hdu.edu.cn/showproblem.php?pid=5547 正所谓:骗分过样例,暴力出奇迹. 解题思想(暴力出奇迹(DFS+回溯)): 1 ...

随机推荐

  1. poj 3134 Power Calculus(IDA*)

    题目大意: 用最小的步数算出  x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A*   就是如果这个数一直平方  所需要的步骤数都不能达到最优   就剪掉 #include < ...

  2. 用html5的canvas生成图片并保存到本地

    原文:http://www.2cto.com/kf/201209/156169.html 前端的代码: [javascript]  function drawArrow(angle)  {      ...

  3. easyui grid中翻页多选方法

    <table class="easyui-datagrid" title="人员选择" id="dg" data-options=&q ...

  4. UDP套接口编程

    常用的UDP实现的程序:DNS域名系统,NFS网络文件系统,SNMP简单网络管理协议 ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int ...

  5. 【绝密外泄】风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1

    [绝密外泄]风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1 由于是[绝密外泄]资料,防止被查,需要的小伙伴赶紧下载附件中的课件文档.由于视频太大了,已放在百度网盘了,已经在附中说 ...

  6. 自行架设DNS的操作步骤及相关说明

    关于什么是DNS及相关的名词及说明,请看 http://www.wdlinux.cn/bbs/viewthread.php?tid=1081&highlight=dns这里,只是说明,在wdd ...

  7. DBCP连接池介绍

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  8. 番茄钟App(Pomodoro Tracker)

    最近为了学习Swift编程语言,写了一个番茄钟的App(Pomodoro Tracker).刚上线的1.2版本增加了Apple Watch的支持. iPhone版 Apple Watch版 如果你跟我 ...

  9. javascript实现继承的方式

    this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window: 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用. 我们还可以使用a ...

  10. Out of resources when opening file 错误解决

    mysqldump: Got error: 23: Out of resources when opening file ‘./mydb/tax_calculation_rate_title.MYD’ ...