AcWing 166. 數獨
題意:
完成數獨
思路:
看到題目,這肯定是搜尋,但是試了一發普通的直接就超時了,肯定要加一些剪枝和優化,首先是位運算優化可以將每一行,每一列,每一個九宮格,都利用一個九位二進位制數儲存,當前還有哪些數字可以填寫,再一個我們肯定是從限制性最高的那個點開始填的,其實每次都是填限制最多的那個數,
涉及到一個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);
}
}
相關文章
- 166. 分數到小數
- Acwing166 數獨題解 - DFS剪枝最佳化
- AcWing871. 約數之和
- 166. 連結串列倒數第n個節點
- AcWing 788. 逆序對的數量
- acwing246 區間最大公約數
- uniapp js 數獨小遊戲 寫死的簡單數獨 數獨 3.0APPJS遊戲
- 求解數獨
- AcWing第85場周賽
- ACwing1064. 小國王
- Acwing 98-分形之城
- Acwing4244牛的比賽
- acwing 116. 飛行員兄弟
- [正常題解]Acwing.5308 公路
- AcWing 393 僱傭收銀員
- [AcWing], 蒙德里安的夢想
- 2020/9/30 Acwing-字首和
- ACWing 147.資料備份
- AcWing演算法基礎1.2演算法
- leetcode:有效的數獨LeetCode
- AcWing 242. 一個簡單的整數問題(樹狀陣列解法)陣列
- PostgreSQL生成任意基數數獨-3SQL
- PostgreSQL生成任意基數數獨-2SQL
- AcWing 95. 費解的開關
- Acwing Arithmetic Learning:資料結構(2)資料結構
- sudoku 數獨 XY-ChainsAI
- LeetCode 36——有效的數獨LeetCode
- LeetCode 37. 解數獨LeetCode
- 9*9的數獨(dfs)
- AcWing 進階課知識點模板梳理
- ACwing291. 蒙德里安的夢想
- 洛谷P1784.數獨
- 數獨問題(DFS+回溯)
- 演算法複習 - AcWing - 資料結構演算法資料結構
- 單獨補題-數正方形
- 最難數獨的快速解法 - pythonPython
- 日行一算(數獨遊戲)遊戲
- 獨一無二的出現次數