hdu 3909 数独扩展
思路:做法与9*9的一样。只不过是变量。
- #include<set>
- #include<map>
- #include<cmath>
- #include<queue>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define pb push_back
- #define mp make_pair
- #define Maxn 4100
- #define Maxm 200010
- #define Y 1100
- #define LL __int645rssss
- #define Abs(x) ((x)>0?(x):(-x))
- #define lson(x) (x<<1)
- #define rson(x) (x<<1|1)
- #define inf 100000
- #define lowbit(x) (x&(-x))
- #define clr(x,y) memset(x,y,sizeof(x))
- #define Mod 1000000007
- using namespace std;
- 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];
- int cnt,n,g[][],id,N,num;
- void init(int n)
- {
- int i;
- for(i=;i<=n;i++){
- R[i]=i+;
- L[i+]=i;
- U[i]=D[i]=i;
- S[i]=;
- }
- clr(H,-);
- R[n]=;
- id=n+;
- }
- void ins(int r,int c)
- {
- U[id]=c;
- D[id]=D[c];
- U[D[c]]=id;
- D[c]=id;
- S[c]++;
- if(H[r]<)
- H[r]=R[id]=L[id]=id;
- else {
- R[id]=R[H[r]];
- L[id]=H[r];
- L[R[H[r]]]=id;
- R[H[r]]=id;
- }
- C[id]=c;
- X[id++]=r;
- }
- void Remove(int c)
- {
- R[L[c]]=R[c];
- L[R[c]]=L[c];
- for(int i=D[c];i!=c;i=D[i]){
- for(int j=R[i];j!=i;j=R[j]){
- D[U[j]]=D[j];
- U[D[j]]=U[j];
- S[C[j]]--;
- }
- }
- }
- void Resume(int c)
- {
- R[L[c]]=c;
- L[R[c]]=c;
- for(int i=D[c];i!=c;i=D[i]){
- for(int j=R[i];j!=i;j=R[j]){
- U[D[j]]=j;
- D[U[j]]=j;
- S[C[j]]++;
- }
- }
- }
- bool dfs(int step,int f)
- {
- int i,k,c,j,temp;
- temp=inf;
- if(R[]==) {
- num=step;
- if(cnt||f){
- cnt++;
- return true;
- }
- cnt++;
- return false;
- }
- for(i=R[];i;i=R[i]) if(S[i]<temp){
- temp=S[i];
- c=i;
- }
- Remove(c);
- for(i=D[c];i!=c;i=D[i]){
- Q[step]=X[i];
- for(j=R[i];j!=i;j=R[j]){
- Remove(C[j]);
- }
- if(dfs(step+,f))
- return true;
- for(j=L[i];j!=i;j=L[j]){
- Resume(C[j]);
- }
- }
- Resume(c);
- return false;
- }
- void build()
- {
- int i,j,k;
- int r,c;
- init(N*N*);
- for(i=;i<=N;i++){
- for(j=;j<=N;j++){
- if(g[i][j]){
- r=(i-)*N*N+(j-)*N+g[i][j];
- c=(i-)*N+g[i][j];
- ins(r,c);
- c=N*N+(j-)*N+g[i][j];
- ins(r,c);
- c=*N*N+(i-)*N+j;
- ins(r,c);
- c=*N*N+((i-)/n*n+(j+n-)/n-)*N+g[i][j];
- ins(r,c);
- }
- else{
- for(k=;k<=N;k++){
- r=(i-)*N*N+(j-)*N+k;
- c=(i-)*N+k;
- ins(r,c);
- c=N*N+(j-)*N+k;
- ins(r,c);
- c=*N*N+(i-)*N+j;
- ins(r,c);
- c=*N*N+((i-)/n*n+(j+n-)/n-)*N+k;
- ins(r,c);
- }
- }
- }
- }
- }
- void solve()
- {
- int i,j,k,r,c;
- cnt=;
- build();
- dfs(,);
- if(!cnt) {
- printf("No Solution\n");
- return;
- }
- if(cnt==){
- printf("Multiple Solutions\n");
- return;
- }
- for(i=;i<=N;i++){
- for(j=;j<=N;j++){
- if(!g[i][j]) continue;;
- c=g[i][j];
- g[i][j]=;
- cnt=;
- build();
- dfs(,);
- if(cnt<)
- break;
- g[i][j]=c;
- }
- if(j<=N) break;
- }
- if(i<=N){
- printf("Not Minimal\n");
- return;
- }
- cnt=;
- build();
- dfs(,);
- for(i=;i<num;i++){
- r=(Q[i]-)/(N*N)+;
- c=(Q[i]-(r-)*(N*N)-)/N+;
- k=(Q[i]-)%N+;
- g[r][c]=k;
- }
- for(i=;i<=N;i++){
- for(j=;j<=N;j++){
- if(g[i][j]<)
- printf("%d",g[i][j]);
- else{
- printf("%c",'A'+g[i][j]-);
- }
- }
- printf("\n");
- }
- }
- int main()
- {
- int i,j,k;
- char str[];
- while(scanf("%d",&n)!=EOF){
- clr(g,);
- N=n*n;
- for(i=;i<=N;i++){
- scanf("%s",str);
- for(j=;j<N;j++) if(str[j]!='.'){
- if(str[j]<=''&&str[j]>='')
- g[i][j+]=str[j]-'';
- else
- g[i][j+]=str[j]-'A'+;
- }
- }
- solve();
- }
- return ;
- }
hdu 3909 数独扩展的更多相关文章
- [2017BUAA软工]结对项目:数独扩展
结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...
- HDU 3909 DLX
http://blog.csdn.net/sr_19930829/article/details/39756513 http://www.kuangbin.net/archives/hdu4069-d ...
- HDU 2669 Romantic 扩展欧几里德---->解不定方程
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 6153 思维+扩展kmp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 扩展kmp不理解的看下:http://www.cnblogs.com/z1141000271/p ...
- HDU 2669 Romantic(扩展欧几里德, 数学题)
题目 //第一眼看题目觉得好熟悉,但是还是没想起来//洪湖来写不出来去看了解题报告,发现是裸的 扩展欧几里得 - - /* //扩展欧几里得算法(求 ax+by=gcd )//返回d=gcd(a,b) ...
- hdu 5512 Pagodas 扩展欧几里得推导+GCD
题目链接 题意:开始有a,b两点,之后可以按照a-b,a+b的方法生成[1,n]中没有的点,Yuwgna 为先手, Iaka后手.最后不能再生成点的一方输: (1 <= n <= 2000 ...
- HDU 1426(数独 DFS)
题意是完成数独. 记录全图,将待填位置处填 0,记录下所有的待填位置,初始化结束.在每个待填位置处尝试填入 1 - 9,若经过判断后该位置可以填入某数字,则继续向下填下一个位置, 回溯时把待填位置重新 ...
- J - Clairewd’s message HDU - 4300(扩展kmp)
题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...
- HDU - 5547 数独(回溯法)
题目链接:HDU-5547 http://acm.hdu.edu.cn/showproblem.php?pid=5547 正所谓:骗分过样例,暴力出奇迹. 解题思想(暴力出奇迹(DFS+回溯)): 1 ...
随机推荐
- poj 3134 Power Calculus(IDA*)
题目大意: 用最小的步数算出 x^n 思路: 直接枚举有限步数可以出现的所有情况. 然后加一个A* 就是如果这个数一直平方 所需要的步骤数都不能达到最优 就剪掉 #include < ...
- 用html5的canvas生成图片并保存到本地
原文:http://www.2cto.com/kf/201209/156169.html 前端的代码: [javascript] function drawArrow(angle) { ...
- easyui grid中翻页多选方法
<table class="easyui-datagrid" title="人员选择" id="dg" data-options=&q ...
- UDP套接口编程
常用的UDP实现的程序:DNS域名系统,NFS网络文件系统,SNMP简单网络管理协议 ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int ...
- 【绝密外泄】风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1
[绝密外泄]风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1 由于是[绝密外泄]资料,防止被查,需要的小伙伴赶紧下载附件中的课件文档.由于视频太大了,已放在百度网盘了,已经在附中说 ...
- 自行架设DNS的操作步骤及相关说明
关于什么是DNS及相关的名词及说明,请看 http://www.wdlinux.cn/bbs/viewthread.php?tid=1081&highlight=dns这里,只是说明,在wdd ...
- DBCP连接池介绍
DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...
- 番茄钟App(Pomodoro Tracker)
最近为了学习Swift编程语言,写了一个番茄钟的App(Pomodoro Tracker).刚上线的1.2版本增加了Apple Watch的支持. iPhone版 Apple Watch版 如果你跟我 ...
- javascript实现继承的方式
this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window: 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用. 我们还可以使用a ...
- Out of resources when opening file 错误解决
mysqldump: Got error: 23: Out of resources when opening file ‘./mydb/tax_calculation_rate_title.MYD’ ...