题意:

完成数独

思路:

看到题目,这肯定是搜索,但是试了一发普通的直接就超时了,肯定要加一些剪枝和优化,首先是位运算优化可以将每一行,每一列,每一个九宫格,都利用一个九位二进制数保存,当前还有哪些数字可以填写,再一个我们肯定是从限制性最高的那个点开始填的,其实每次都是填限制最多的那个数,
涉及到一个lowbit函数:当前得需要用lowbit运算取出当前可以能填的数字.

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
char mp[10][10];//二维和一维存放
int c[10],r[10],g[10];//行与列
int cnt[1100],num[1100];
int k,tot;
int lowbit(int x) {return x&(-x);
}
int get(int x,int y) {return ((x/3)*3)+(y/3);
}
void fun(int x,int y,int z) {r[x]^=1<<z;c[y]^=1<<z;g[get(x,y)]^=1<<z;
}
int dfs(int now) {if(now == 0) return 1;int tmp = 10,x,y;for(int i=0;i<9;i++) {for(int j=0;j<9;j++) {if(mp[i][j]!='.') continue;int val = r[i] & c[j] & g[get(i,j)];if(!val) return 0;if(cnt[val]<tmp) {tmp = cnt[val];x = i,y = j;}}}int val = r[x] & c[y] & g[get(x,y)];for(;val;val-=lowbit(val)) {int z = num[lowbit(val)];mp[x][y] = z+'1';fun(x,y,z);if(dfs(now-1)) return 1;fun(x,y,z);mp[x][y] = '.';}return 0;
}
int main()
{for(int i=0;i<1<<9;i++) {//预处理初始能放的数有多少个for(int j=i;j;j-=lowbit(j)) {cnt[i]++;}} for(int i=0;i<9;i++) num[1<<i] = i;char s[100];while(scanf("%s",s)&&s[0]!='e') {for(int i=0;i<9;i++) c[i] = r[i] = g[i] = (1<<9)-1;for(int i=0;i<9;i++) {for(int j=0;j<9;j++) {mp[i][j] = s[i*9+j];}}tot=0;for(int i=0;i<9;i++) {for(int j=0;j<9;j++) {if(mp[i][j]!='.') {fun(i,j,mp[i][j]-'1');} else {tot++;}    }}dfs(tot);for(int i=0;i<9;i++) {for(int j=0;j<9;j++) {s[i*9+j] = mp[i][j];}}puts(s);}
}

AcWing 166. 数独相关推荐

  1. AcWing 166 数独

    题目描述: 数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图中每行.每列.每个3 × 3的九宫格内数字1~9均恰好出现一次. 请编写一个程序填写数独. 输入格式 输入包含多组测试用 ...

  2. 【acwing】166. 数独****(DFS)

    穿越隧道 如何能正确的搜出所有的方案 1.顺序 2.剪枝 搜索: 1.优化搜索顺序 大部分情况下,应优选搜索分支较少的节点 2.排除等效冗余 3.可行性剪枝 4.最优性剪枝 5.记忆化搜索(DP) 在 ...

  3. AcWing 1613. 数独简单版

    尽管说是数独简单版,可是对我来说却一点都不简单啊,这个很明显是用递归解决,这个递归又不同以往的递归,以往是一个节点为单位往下找,这个是一行为单位,从(0,0)到(9,9)顺序完全遍历一遍,我只涉及点为 ...

  4. AcWing 703. 数独检查

    **数独是一种流行的单人游戏. 目标是用数字填充9x9矩阵,使每列,每行和所有9个非重叠的3x3子矩阵包含从1到9的所有数字. 每个9x9矩阵在游戏开始时都会有部分数字已经给出,通常有一个独特的解决方 ...

  5. 【算法专题】数独问题详解

    数独问题详解 1. 概述 根据百度百科的描述:数独(shù dú)是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并 ...

  6. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  7. DFS剪枝优化 小猫爬山 数独

    DFS剪枝策略总结 优化搜索顺序 优先搜索分支数少(剩余选择少)的情况 排除等效冗余 若对顺序没有要求 可以将排列转化为组合 可行性剪枝 不合法的情况不进行搜索 最优化剪枝 若当前的"消耗& ...

  8. 0x22.搜索 - 深度优先搜索

    目录 一.DFS三个经典NPC问题 1.子集和问题 2.全排列问题 3.N皇后问题 luogu P1219 [USACO1.5]八皇后 Checker Challenge luogu P1562 还是 ...

  9. AcWing算法提高课笔记

    目录 Level2 1.动态规划--从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1 ...

最新文章

  1. 【SAP-PM模块】维护业务处理流程
  2. 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
  3. 完美运动框架(js)
  4. 使用jQuery图表插件Sparklines来开发一个实用的网站PV(page view)实时监控应用
  5. 电脑无法连接到系统服务器,请问怎么客户端的电脑连接不到服务器?这是什么原因?...
  6. win怎么打开微软更新服务器,怎样打开win10的更新服务器地址
  7. 获取数组中元素值为偶数的累加和与元素值为奇数的累加和,并计算他们之间的差值
  8. mysql结果行数_取得数据库结果集中的行数
  9. Eclipse中自动创建set、get方法
  10. [Android 新特性] 有史来最大改变 Android 5.0十大新特性
  11. 反向传播算法(BP)学习笔记
  12. Python语法命令学习-Day3(作业练习)
  13. 从零玩转第三方登录之QQ登录
  14. java中的工作流要怎样实现_java工作流开发要怎么实现?
  15. IOS-页面跳转与切换
  16. 符号——Alt+数字键
  17. GMap.NET控件使用
  18. 证件识别接口编写的JAVA调用示例
  19. 文本行高——line-height属性
  20. 自主移动机器人常用的导航定位技术及原理

热门文章

  1. Python多线程爬取行行网电子书
  2. 交互设计课程的心得体会
  3. 大人工智能时代,比较热门的互联网职位有哪些?
  4. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI .
  5. Spring AOP 切点详解
  6. 透明度叠加算法:如何计算半透明像素叠加到另一个像素上的实际可见像素值(附 WPF 和 HLSL 的实现)
  7. linux照片备份软件,Linux、Unix上5个惊艳开源备份软件
  8. Android TabLayout选项卡点击选中Ripple水波纹
  9. R-C3D—基于区域卷积3D网络的时序行为检测
  10. Android开发:通过ADB安装手表或者手机App