csdn同步
原題鏈結
前置知識:
** \(\text\) 演算法
注:這次的前置知識如果你不會又不看,**和思路肯定都看不懂的。
簡要題意:
填滿乙個未完成的數獨。
首先數獨的規則是:
每行所填數不得重複,為 \(1\) ~ \(9\) 之間。
每列所填數不得重複,為 \(1\) ~ \(9\) 之間。
每宮所填數不得重複,為 \(1\) ~ \(9\) 之間。
首先這是乙個數學遊戲,但是如果你想在 \(1s\) 之內 \(\text\) 吊打全場,那麼就要學習如何解決數獨問題。
下面我們來說說,怎麼把它扯到精確覆蓋上面呢。
決策應該是形如 \((i,j,x)\) 的三元組,表示 \(a_ = x\).
第 \(i\) 行只能用乙個 \(x\),需要 \(9 \times 9 = 81\) 列。(每個格仔都要開一列,對應 \(1\) ~ \(81\) 列)
第 \(j\) 列只能用乙個 \(x\) ,再開 \(9 \times 9 = 81\) 列。(每個格仔都要開一列,對應 \(82\) ~ \(162\) 列)
\((i,j)\) 所在的宮只能用乙個 \(x\),再開 \(9 \times 9 = 81\) 列。(每個格仔都要開一列,對應 \(162\) ~ \(243\) 列)
\((i,j)\) 只能填乙個數(千萬不要忽略這個!),再開 \(9 \times 9 = 81\) 列。(每個格仔都要開一列,對應 \(244\) ~ \(324\) 列)
那麼多少行呢?顯然,\(9^3 = 729\) 行,因為每個行、列、宮都要決策一次。
所以我們就將數獨問題轉化成乙個 \(729 \times 324\) 的矩陣上有 \(729 \times 4 = 3216\) 個 \(1\) 的精確覆蓋問題。
然後直接套板子,主要建圖即可。
時間複雜度:\(o(wys)\).(很優但難以說明,嚴格來說是 \(o(c^n)\) ,其中 \(n \leq 3216\),\(c\) 為極其接近 \(1\) 的常數)
實際得分:\(100pts\).
// 板子部分不再解釋
#pragma gcc optimize(2)
#includeusing namespace std;
const int n=1e5+1;
#define for(i,a,x) for(int i=a[x];i!=x;i=a[i])
inline int read()
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,m,id,fir[n],siz[n];
int l[n],r[n],u[n],d[n];
int col[n],row[n],ans;
int stk[n];
inline void remove(int x)
inline void recover(int x)
inline void build(int x,int y)
inline void insert(int x,int y)
int a[1001][1001];
inline bool dance(int dep) return 1;
} int wz=r[0]; for(i,r,0) if(siz[i]remove(wz); for(i,d,wz) recover(wz); return 0;
}int main()
} dance(1);
for(int i=1;i<=9;i++)
return 0;
}
洛谷 P1784 數獨
題目描述 數獨是根據9 9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行 每一列 每乙個粗線宮內的數字均含1 9,不重複。每一道合格的數獨謎題都有且僅有唯一答案,推理方法也以此為基礎,任何無解或多解的題目都是不合格的。芬蘭一位數學家號稱設計出全球最難的 數獨遊戲 並刊登在報紙上,讓大家去挑...
洛谷 P1784 數獨
洛谷傳送門 數獨是根據 9 times 99 9 盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行 每一列 每乙個粗線宮內的數字均含 1 91 9 不重複。每一道合格的數獨謎題都有且僅有唯一答案,推理方法也以此為基礎,任何無解或多解的題目都是不合格的。芬蘭一位數學家號稱設計出全球最難的 數獨...
洛谷 P1784 數獨
數獨是根據9 9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行 每一列 每乙個粗線宮內的數字均含1 9,不重複。每一道合格的數獨謎題都有且僅有唯一答案,推理方法也以此為基礎,任何無解或多解的題目都是不合格的。芬蘭一位數學家號稱設計出全球最難的 數獨遊戲 並刊登在報紙上,讓大家去挑戰。這位數...