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 ...
随机推荐
- sql server 复制 需要有实际的服务器名称才能连接到服务器……
原因是:之前修改过服务器实例名称执行一下语句 select @@servername select SERVERPROPERTY ('servername') 可以看到,两个不同的结果 修改实例名称i ...
- [转载]NoSQL数据库的基础知识
关系型数据库和NoSQL数据库 什么是NoSQL 大家有没有听说过“NoSQL”呢?近年,这个词极受关注.看到“NoSQL”这个词,大家可能会误以为是“No!SQL”的缩写,并深感愤怒:“SQL怎么会 ...
- 通过css代码使边框变圆角(ie9以下浏览器不支持)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-11) CSS代码: <style> #myDiv { border-radius: 4px; /*这句就是 ...
- 【M14】明智运用异常规范
1.异常规范的使用场景是,承诺方法只抛出什么样的异常,或者不抛出异常.如果运行的时候,不满足承诺,C++自动调用unexpected方法,unexpected调用terminate方法,termina ...
- UVA 12901 Refraction 几何/大雾题
Refraction Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- Android横竖屏切换及其相应布局载入问题
第一.横竖屏切换连带载入多屏布局问题: 假设要让软件在横竖屏之间切换.因为横竖屏的高宽会发生转换,有可能会要求不同的布局. 能够通过下面两种方法来切换布局: 1)在res文件夹下建立layout-la ...
- 微软免费TFS如何设置在客户端独占签出
最近发现微软给我们提供了免费的TFS,地址:http://tfs.visualstudio.com/, 就注册了一个,但是我发现没办法独占签出. 在公司里,TFS有服务端,所以很好设置,但是注册微软的 ...
- Javascript实现鼠标框选元素后拖拽被框选的元素
之前需要做一个框选元素后拖拽被框选中的元素功能,在网上找资料做了一些修改,基本达到了需要的效果,希望对也需要实现框选后拖拽元素功能的人有用. 页面加载后效果 框选后的内容可以拖拽,如下图: 代码下载
- 四元数(Quaternion)和旋转
四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转. ...
- LeetCode20 Valid Parentheses
题意: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...