YBTOJ 数独游戏
题面
题目分析:
选择一个当前可选的数最小的位置,依次填入各个可能填入的数。
考虑怎么实现:
为了快速地得到每个位置可以选择的位置,可以将当前树所在的行、列、九宫格的填入状态压入一个二进制中储存。
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 数独游戏相关推荐
- 【dfs】数独游戏(ybtoj dfs-1-2)
数独游戏 ybtoj dfs-1-3 题目大意 给出一个未完成的数独,让你完成它 输入样例 4.....8.5.3..........7......2.....6.....8.4......1.... ...
- ybtoj DFS 1 拔河比赛 数独游戏 虫食算
前情详见 dfs+search T1:拔河比赛 拔河比赛两边人数最多不能相差1 . 每个队员都有体重,我们要使两边比赛的人体重和相差最小. 现在有 n 个队员,韩老师想你帮忙分配,并且把分配后两边体重 ...
- YBTOJ 入门到进阶模拟赛 Day2 数独游戏
数独游戏 link 判断重复 数独要求每一行.每一列.每一个3×3方阵内的数字,不重复. 行和列重复判断是相当简单的. 我们可以定义两个bool型二维数组, 当此行(或列)填充数字时, 我们可以直接把 ...
- 用 JS 做一个数独游戏(二)
用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...
- Leetcode0037--Sudoku Solver 数独游戏
[转载请注明]http://www.cnblogs.com/igoslly/p/8719622.html 来看一下题目: Write a program to solve a Sudoku puzzl ...
- python数独游戏源代码100行_python实现解数独程序代码
偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...
- 注入游戏没有焦点_数独游戏 数学之美(三)
一揭晓上期答案同学们,上周的数独题目你们做对了吗?让我们一起来看看正确答案吧! 二学生讲解数独游戏是一种非常益智的推理游戏,它可以提高你的逻辑思维能力.让我们来听一听这位同学的解题思路吧!三讲解新知这 ...
- python数独游戏源代码_使用Python编写数独游戏自动出题程序
数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...
- 2014/School_C_C++_A/6/“数独”游戏
你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...
最新文章
- sql server:alter database name
- boost::type_index::type_id相关的测试程序
- c语言case怎么输入字母,如何使用switch case语句将字母转换为数字
- 深入浅出话VC++(2)——MFC的本质
- zookeeper的集群配置
- asp.net模板控件示例
- ICML'21 GNN的最新研究热点
- RubyCritic:一款不错的检测代码质量工具
- Visual Studio Code 1.30 发布,你升级了没?
- POJ 3308 最少点集覆盖
- python取消任务的方法_python里取消一个未曾执行的任务
- 软件开发的需求文档如何去写
- mac怎么设置桌面提醒
- lga2066服务器准系统,LGA2066低配版Corei7-7740K再曝光:21WTDP换来100MHz频率
- 关于中台的深度思考和中台实战
- 大数据入门概念及应用场景
- 多多进鱼带VUE源码-任务悬赏网站源码-活动营销三级分销返佣积分商城版
- 企业为什么要上OA?
- python 机器学习 sklearn 朴素贝叶斯
- (openCV 十)ML_SVM