【DFS】【剪枝】数独(简单版)
题目链接:
https://www.acwing.com/problem/content/168/
搜索以及剪枝策略:
- 搜索顺序优化: 首先搜索可填最少数量数字的格子
- 二进制优化:用两个数组
row[], col[]
存储每一行和每一列的可以填的数的状态,一共9位二进制,该位为1时代表可以选,为0时代表不可以选。 lowbit
优化:取每一位可以选的数时采用的操作
代码解释:
mn
:就是单元格中求 最小的可以填的个数
ones[i]
:i
二进制中1
的个数
dfs(cnt)
:代表从可以填cnt
个数开始搜索
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 9;int ones[1 << N], mp[1 << N];
int row[N], col[N], cell[3][3];
char s[100];
// 获取可以填的数的二进制状态
int get(int x, int y)
{return row[x] & col[y] & cell[x / 3][y / 3];
}
bool dfs(int cnt)
{if(!cnt) return true;int mn = 10;int x, y;for(int i = 0; i < N; i++)for(int j = 0; j < N; j++){if(s[i * N + j] == '.'){int t = ones[get(i, j)];if(t < mn){mn = t;x = i, y = j;}}}for(int i = get(x, y); i; i -= i & (-i)){int t = mp[i & (-i)];row[x] -= 1 << t;col[y] -= 1 << t;cell[x / 3][y / 3] -= 1 << t;s[x * N + y] = '1' + t;if(dfs(cnt - 1)) return true;row[x] += 1 << t;col[y] += 1 << t;cell[x / 3][y / 3] += 1 << t;s[x * N + y] = '.';}return false;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);for(int i = 0; i < N; i++) mp[1 << i] = i;for(int i = 0; i < 1 << N; i++){int cnt = 0;for(int j = i; j; j -= j & (-j)) cnt++;ones[i] = cnt;}while(cin >> s, s[0] != 'e'){for(int i = 0; i < N; i++)row[i] = col[i] = (1 << N) - 1;for(int i = 0; i < 3; i++)for(int j = 0; j < 3; j++)cell[i][j] = (1 << N) - 1;int cnt = 0;for(int i = 0, k = 0; i < N; i++)for(int j = 0; j < N; j++, k++){if(s[k] != '.'){int t = s[k] - '1';row[i] -= (1 << t);col[j] -= (1 << t);cell[i / 3][j / 3] -= (1 << t);}else cnt++;}dfs(cnt);cout << s << "\n";}return 0;
}
【DFS】【剪枝】数独(简单版)相关推荐
- AcWing 1613. 数独简单版
尽管说是数独简单版,可是对我来说却一点都不简单啊,这个很明显是用递归解决,这个递归又不同以往的递归,以往是一个节点为单位往下找,这个是一行为单位,从(0,0)到(9,9)顺序完全遍历一遍,我只涉及点为 ...
- 每日刷题之数独简单版 AcWing 1613
数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行.每列.每个 3×3 的九宫格内数字 1∼9 均恰好出现一次. 请编写一个程序填写数独. 输入格式 输入共 9 行,每行包含一 ...
- DFS剪枝优化 小猫爬山 数独
DFS剪枝策略总结 优化搜索顺序 优先搜索分支数少(剩余选择少)的情况 排除等效冗余 若对顺序没有要求 可以将排列转化为组合 可行性剪枝 不合法的情况不进行搜索 最优化剪枝 若当前的"消耗& ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- 数据结构练习题――Hero In Maze 简单版
数据结构练习题――Hero In Maze 简单版 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:306 ...
- LeetCode 11. Container With Most Water--Java 解法--困雨水简单版
LeetCode 11. Container With Most Water–Java 解法 此文首发于我的个人博客:LeetCode 11. Container With Most Water–Ja ...
- luogu P3808 【模板】AC自动机(简单版)
二次联通门 : luogu P3808 [模板]AC自动机(简单版) /*luogu P3808 [模板]AC自动机(简单版)手速越来越快了10分钟一个AC自动机一遍过编译 + 一边AC感觉不错我也就 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- 008 数据结构逆向—数组(简单版)
文章目录 前言 逆向背包数组 一维背包数组 二维背包数组 数组结构分析 总结 前言 对于游戏逆向来说,核心需求其实就只有两个 追踪游戏数据 定位游戏功能call 对于追踪游戏数据来说,单纯从一个寄存器 ...
- 【模板】AC自动机(简单版)
题目背景 通过套取数据而直接"打表"过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据 ...
最新文章
- 2022-2028年中国UTM市场投资分析及前景预测报告
- 【博客话题】技术人生之三界修炼
- Forefront基本知识介绍
- 1CCTableView的使用,TableView响应和小格子tableView实现
- c#操作word表格
- 技术竞争力之Web技术方向
- 为什么 战舰stm32f103开发板32.768k晶振没有接电容
- app中的h5游戏分享到微信等第三方
- JAVA如何动态加载jar,并调用对应的函数?
- 汇编语言程序设计(一)
- 关于urule决策引擎客户端服务器配置的一些细节
- visio添加连接点
- ERROR 999999: Error executing function. The table name is invalid. No spatial reference exists.
- 关于maven仓库的配置步骤
- es数据更新时间_京东到家订单中心系统mysql到es的转化之路
- 模块学习4:(1)通过MQTT协议和电信云平台的通信(内附MQTT协议V3.1.1的原版和中文参考资料)
- NB-IOT 协议介绍
- 衡水东方计算机学校地址,衡水东方计算机学校
- C语言程序身高英尺转换为厘米
- 小白站长是如何战胜注册机攻击的?
热门文章
- 五万字 | Flink知识体系保姆级总结
- AI得贤招聘官上线ChatGPT,免费为企业提供AI智能助手Molly
- LiveGBS国标GB/T28181视频流媒体平台云端录像配置开启关闭支持录像计划根据计划自动录制
- WINUSB设备的inf文档的编写
- sibelius西贝柳斯2023中文版是什么打谱软件?如何下载
- 数据结构-算法与算法描述
- python学习之旅_第1天
- 请问现在好多抖音巨量广告落地页pages.tmall.com的页面如何生成
- php 浏览器打开excel文件夹里,php网页显示excel表格数据-phpexcel 读取excel里的数据并在页面显示出来...
- Python | Flask 解决跨域问题