题面


题目分析:

选择一个当前可选的数最小的位置,依次填入各个可能填入的数。

考虑怎么实现:
为了快速地得到每个位置可以选择的位置,可以将当前树所在的行、列、九宫格的填入状态压入一个二进制中储存。

Code

#include<bits/stdc++.h>
using namespace std;
const int INF=1e9+7;
int cnt[10004];//cnt[i]存储每个9位二进制数i能被取几次lowbit,即当前状态i先还有几个1,即当前状态还有几个数可选
int num[10004];//num[i]用二进制表示每一个数,lowbit(i)中i位于第几位,i代表第几个数
//num和cnt的值事先被预处理好,不会在过程中被改变
int tot;//表示开始时未被填入数字的格子数有多少
int mapp[10][10];//存储每个位置所存的数字
int a[10],b[10],c[10];//a,b,c分别存储行、列、九宫格中的每个数是否可选的状态(压成二进制表示)
char s[82];
int f(int x,int y){return x/3*3+y/3;}//f函数可以快速得到每个点所在九宫格的编号
int lowbit[5005];
void change(int x,int y,int v)
{   a[x]^=(1<<v);b[y]^=(1<<v);c[f(x,y)]^=(1<<v);
}//把v对应的位数更改一下(这里用xor更改,因此可以完成两种修改:不可选->可选 or 可选->不可选
bool dfs(int idx)
{if(idx==tot+1) return true;int Minv=INF,x=0,y=0;for(int i=0;i<9;++i)                                                                                               {for(int j=0;j<9;++j){if(mapp[i][j]!=-1) continue;   int state=a[i]&b[j]&c[f(i,j)];if(cnt[state]==0) return false;if(cnt[state]<Minv) Minv=cnt[state],x=i,y=j;}}int state=a[x]&b[y]&c[f(x,y)];for(;state;state-=lowbit[state]){int val=num[lowbit[state]];mapp[x][y]=val;change(x,y,val);if(dfs(idx+1)) return true;change(x,y,val);mapp[x][y]=-1;    }return false;
}
void work()
{tot=0;for(int i=0;i<9;++i) a[i]=b[i]=c[i]=(1<<9)-1;for(int i=0;i<9;++i){for(int j=0;j<9;++j){char ch=s[i*9+j];if(ch=='.') tot++,mapp[i][j]=-1;else mapp[i][j]=ch-'1',change(i,j,mapp[i][j]);}}dfs(1);for(int i=0;i<9;++i) for(int j=0;j<9;++j)printf("%d",mapp[i][j]+1);printf("\n");
}
int main()
{for(int i=0;i<(1<<9);++i) lowbit[i]=i&(-i);for(int i=0;i<9;++i) num[1<<i]=i; for(int i=0;i<(1<<9);++i)for(int j=i;j;j-=lowbit[j])cnt[i]++;while(scanf("%s",s),s[0]!='e') work();return 0;
}

YBTOJ 数独游戏相关推荐

  1. 【dfs】数独游戏(ybtoj dfs-1-2)

    数独游戏 ybtoj dfs-1-3 题目大意 给出一个未完成的数独,让你完成它 输入样例 4.....8.5.3..........7......2.....6.....8.4......1.... ...

  2. ybtoj DFS 1 拔河比赛 数独游戏 虫食算

    前情详见 dfs+search T1:拔河比赛 拔河比赛两边人数最多不能相差1 . 每个队员都有体重,我们要使两边比赛的人体重和相差最小. 现在有 n 个队员,韩老师想你帮忙分配,并且把分配后两边体重 ...

  3. YBTOJ 入门到进阶模拟赛 Day2 数独游戏

    数独游戏 link 判断重复 数独要求每一行.每一列.每一个3×3方阵内的数字,不重复. 行和列重复判断是相当简单的. 我们可以定义两个bool型二维数组, 当此行(或列)填充数字时, 我们可以直接把 ...

  4. 用 JS 做一个数独游戏(二)

    用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...

  5. Leetcode0037--Sudoku Solver 数独游戏

    [转载请注明]http://www.cnblogs.com/igoslly/p/8719622.html 来看一下题目: Write a program to solve a Sudoku puzzl ...

  6. python数独游戏源代码100行_python实现解数独程序代码

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  7. 注入游戏没有焦点_数独游戏 数学之美(三)

    一揭晓上期答案同学们,上周的数独题目你们做对了吗?让我们一起来看看正确答案吧! 二学生讲解数独游戏是一种非常益智的推理游戏,它可以提高你的逻辑思维能力.让我们来听一听这位同学的解题思路吧!三讲解新知这 ...

  8. python数独游戏源代码_使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...

  9. 2014/School_C_C++_A/6/“数独”游戏

    你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...

最新文章

  1. sql server:alter database name
  2. boost::type_index::type_id相关的测试程序
  3. c语言case怎么输入字母,如何使用switch case语句将字母转换为数字
  4. 深入浅出话VC++(2)——MFC的本质
  5. zookeeper的集群配置
  6. asp.net模板控件示例
  7. ICML'21 GNN的最新研究热点
  8. RubyCritic:一款不错的检测代码质量工具
  9. Visual Studio Code 1.30 发布,你升级了没?
  10. POJ 3308 最少点集覆盖
  11. python取消任务的方法_python里取消一个未曾执行的任务
  12. 软件开发的需求文档如何去写
  13. mac怎么设置桌面提醒
  14. lga2066服务器准系统,LGA2066低配版Corei7-7740K再曝光:21WTDP换来100MHz频率
  15. 关于中台的深度思考和中台实战
  16. 大数据入门概念及应用场景
  17. 多多进鱼带VUE源码-任务悬赏网站源码-活动营销三级分销返佣积分商城版
  18. 企业为什么要上OA?
  19. python 机器学习 sklearn 朴素贝叶斯
  20. (openCV 十)ML_SVM

热门文章

  1. 自行车、电动车、摩托车灯、LED 照明降压型 LED 恒流驱动方案
  2. 收藏【火狐浏览器、谷歌浏览器】历史版本下载网站
  3. wordpress(awd复现)
  4. IDEA新建文件时设置作者和日期注释
  5. LaTex中设置目录、参考文献等超级链接的颜色
  6. 视频监控边缘分析盒 yolov5
  7. android MediaPlayer无法自动播放问题,切换下一首,自动播放下一首。
  8. HarmonyOS实战——CommonDialog组件的基本使用
  9. 【genius_platform软件平台开发】第九十八讲:嵌入式网络接口(MAC、PHY)
  10. 耗时统计利器——StopWatch秒表