转载自:http://blog.csdn.net/lyhypacm/article/details/5923287

题意:

一个16*16的数独问题。

思路:

和poj3024一样,就改点东西。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>using namespace std;const int oo=0x3f3f3f3f;
const int nR=16*16*16+10;
const int nC=16*16*4;
const int MAX=nR*4+nC+10;
const int delta[]={1,16*16+1,16*16*2+1,16*16*3+1};
const int head=0;int cnt[nC+10],st[nC+10];
int left[MAX],right[MAX],up[MAX],down[MAX];
int row[MAX],col[MAX];
struct Ans
{int r,c,k;
}ans[MAX];
int M,K;void remove(const int& c)
{left[right[c]]=left[c];right[left[c]]=right[c];for(int i=down[c];i!=c;i=down[i])for(int j=right[i];j!=i;j=right[j]){up[down[j]]=up[j];down[up[j]]=down[j];cnt[col[j]]--;}
}void resume(const int& c)
{for(int i=up[c];i!=c;i=up[i])for(int j=left[i];j!=i;j=left[j]){down[up[j]]=j;up[down[j]]=j;cnt[col[j]]++;}left[right[c]]=c;right[left[c]]=c;
}bool dfs(const int& k)
{if(right[head]==head){char s[300]={0};for(int i=0;i<k;i++)s[ans[st[i]].r*16+ans[st[i]].c]=ans[st[i]].k+'A';for(int i=0;i<16;i++){for(int j=0;j<16;j++){putchar(s[i*16+j]);}puts("");}return true;}int s=oo,c=0;for(int i=right[head];i!=head;i=right[i])if(cnt[i]<s){s=cnt[i];c=i;}remove(c);for(int i=down[c];i!=c;i=down[i]){st[k]=row[i];for(int j=right[i];j!=i;j=right[j])remove(col[j]);if(dfs(k+1))return true;for(int j=left[i];j!=i;j=left[j])resume(col[j]);}resume(c);return false;
}void init()
{left[head]=nC;right[head]=1;up[head]=down[head]=head;for(int i=1;i<=nC;i++){left[i]=i-1;right[i]=(i+1)%(nC+1);up[i]=down[i]=i;cnt[i]=0;col[i]=i;row[i]=0;}M=0;K=nC;
}int makecolhead(const int& c)
{K++;cnt[c]++;col[K]=c;row[K]=M;left[K]=right[K]=K;up[K]=c;down[K]=down[c];up[down[K]]=K;down[up[K]]=K;return K;
}void addcol(const int& id,const int& c)
{K++;cnt[c]++;col[K]=c;row[K]=M;left[K]=id;right[K]=right[id];left[right[K]]=K;right[left[K]]=K;up[K]=c;down[K]=down[c];up[down[K]]=K;down[up[K]]=K;
}void addrow(const int& i,const int& j,const int& k)
{int id;M++;ans[M].r=i;ans[M].c=j;ans[M].k=k;id=makecolhead(16*i+j+delta[0]);addcol(id,16*i+k+delta[1]);addcol(id,16*j+k+delta[2]);addcol(id,(i/4*4+j/4)*16+k+delta[3]);
}int main()
{char str[300];char s[300];int pos;bool blocks=false;while(~scanf("%s",str)){if(blocks)puts("");elseblocks=true;init();pos=0;for(int i=0;i<16;i++)s[pos++]=str[i];for(int i=1;i<16;i++){scanf("%s",str);for(int j=0;j<16;j++)s[pos++]=str[j];}for(int i=0;i<16;i++)for(int j=0;j<16;j++)if(s[i*16+j]=='-')for(int k=0;k<16;k++)addrow(i,j,k);elseaddrow(i,j,s[i*16+j]-'A');dfs(0);}return 0;
}

poj3076(16*16数独)相关推荐

  1. 帧内16*16模式的宏块数据传输顺序

    如果宏块以16*16帧内模式编码,那么块-1首先被传输,携带的信息是每个4*4亮度块的DC系数.然后,亮度残差块0-15被传输(此时,16*16帧内宏块的DC系数为零).对于亮度分量Cb和Cr,16和 ...

  2. 为什么连接xshell报错Could not connect to 172.16.16.100 (port 22): Connection failed

    连接xshell报错Could not connect to '172.16.16.100' (port 22): Connection failed. 今天小编也遇到了这个问题开启虚拟机连接xshe ...

  3. 2016年8月15日 星期一 --出埃及记 Exodus 16:16

    2016年8月15日 星期一 --出埃及记 Exodus 16:16 This is what the LORD has commanded: `Each one is to gather as mu ...

  4. LED 16*16点阵显示屏

    实验二   16*16点阵 高亮度LED发光管构成点阵,通过编程控制可以显示中英文字符.图形及视频动态图形.所显示字符的点阵数据可以自行编写(即直接点阵画图),也可从标准字库(如ASC16.HZ16) ...

  5. 单片机做的音乐盒c语言程序,16*16滚动点阵屏+音乐盒C语言源程序

    #include sbit RCK=P2^2; sbit SRCK_1=P2^3; sbit SRCK_2=P2^4; sbit SER_IN_1=P2^5; sbit SER_IN_2=P2^6; ...

  6. 3.7 51单片机-LED 16*16点阵

    3.7 LED 16*16点阵 3.7.1 点阵原理图 图3-7-1 LED点阵使用连线说明:P595_A接J17.P595_B接J18.JP595跳线帽需要接上.JP1302断开.J11(P3.3) ...

  7. 史上“最”简单的扫雷(16*16 40雷)

    如果我们要实现扫雷,那么我们要解决以下问题: 1.初始菜单  如果是最简单的当然不要了 2.地图的初始化 3.雷的数量和分布位置(随机分布) 4.排查雷的位置 5.判断是否正确 6.这个格子周围没有雷 ...

  8. An Image is worth 16*16 words: Transformers for image recognition at scale.

    An Image is worth 16*16 words: Transformers for image recognition at scale. Abstract 虽然Transformer架构 ...

  9. 51单片机 点阵显示器显示设计 点阵控制器 16*16点阵 广告牌 proteus 仿真

    课程设计题二十二:点阵显示器显示设计 (1)上电后滚动显示学校名称. (2)按键1按下,滚动显示班级. (3)按键2按下,滚动显示姓名及学号. (4)一键开关. 首先找一个差不多的设计 这个设计网上找 ...

最新文章

  1. AngularJs学习笔记--expression
  2. Thread-方法以及wait、notify简介
  3. spring boot基础教程:入门程序Hello World的编写
  4. Eclipse中如何恢复已删除文件
  5. git clone 时候出现Please make sure you have the correct access rights and the repository exists.
  6. Docker 数据持久化的三种方案
  7. 数据科学入门与实战:Matplotlib绘图Series
  8. Android 系统(255)---dump解码所得图片方法
  9. MyEclipse 10.5与ExtJS 4.1.1自动代码提示
  10. 锐捷linux客户端进路由器,锐捷WLAN无线产品之SSH管理
  11. 美国大学课堂的契约精神(纽约时报中文网 )
  12. Written English-书面-现在完成进行时
  13. 计算机二级选择题笔记百度云,计算机二级题库及计算机二级ms office 复习笔记.doc...
  14. 鸿蒙os桌面怎么布局好看,桌面布局怎样才好看?OriginOS出手,带来百变玩法
  15. python示例--下载mysql数据库中数据--excel表格,合并表格
  16. python用matplotlib画球_Python 用matplotlib画以时间日期为x轴的图像
  17. nodelist与HTMLCollection
  18. SqlDataReader转换为DataTable
  19. oracle库函数,Oracle:函数目录
  20. Exynos4412开发板

热门文章

  1. 科大星云诗社动态20210313
  2. 定义咯一个枚举变量枚举变量怎么打印出来 linux c,以C语言的字符串形式输出枚举变量...
  3. 1的恢复出厂设置在哪里_无线路由器怎么恢复出厂设置
  4. GPS服务端解析程序编写日记之--vs2010中多种语言开发及调试的若干注意事项
  5. python基础——变量和数据类型及常见类型转换函数
  6. eclipse安装m2e.sourcelookup插件debug第三方源码(spring)
  7. 开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44
  8. 看看牛人们是怎么评价编程语言的
  9. 「 每日一练,快乐水题 」258. 各位相加
  10. linux驱动开发书籍(待续)