数独知多少 - 编程之美 4.9


http://www.cnblogs.com/Linkabox/p/3361014.html
问题:一共有多少种不同的数独解答呢?其中有多少种是独立的解答呢?
如果用一个字符串来表示各种数独,如何保证一一对应的基础上,让字符串的长度最短?
分析:
首先要明确问题,独立的解答到底是什么?如何定义“独立”这种关系?
如果任意交换数独的两个数字,仍然是一个合法的数独。
那么我们可以定义:如果两个数独解答可以通过这种交换得到,则它们就不是独立的。
假设不考虑独立的情况下,一个空的数独有N个解答,那么独立的解答应该为 N/( 9! )。
问题一解题思路:一种用探索(heuristic)的方法估计解答总数
原理:将数独划分为9块,B1、B2….B8、B9
块行解:一个解使得“块行”内每行每块恰好包含1到9
块列解:一个解使得“块列”内每列每块恰好包含1到9
标准型:
123
456
789
下面讨论基于B1为标准型的“块行解”,假设有N个,则“块行解”总共有9!*N个。
以下的B2和B3第一行由B1的第二或第三行构成称为“纯粹型”
123{456}{789}
456{789}{123}
789{123}{456}
每一行的3个元素可以任意互换((3!)^6),可以任意放入6行中的一行,并且B2和B3位置可以交换。
所以共有“纯粹型”:2*(3!)^6。
以下的B2和B3第一行由B1的第二或第三行混合构成称为“混合型”
123{457}{689}
456{894}{7bc}
789{6bc}{45a}
其中a、b、c表示1、2、3所在位置,a可以是1、2、3中任意一个数;(3)
每行的3个元素可以任意互换;((3!)^6)
B2和B3位置可以交换;(2)
此外B2和B3的第一行共有以下9种可能:(9)
{4,5,7}|{6,8,9}
{4,5,8}|{6,7,9}
……
所以共有“混合型”:3*2*9*(3!)^6
基于B1为标准型的“块行解”有:2*(3!)^6+3*2*9*(3!)^6
总的“块行解”有:R=9!*(2*(3!)^6+3*2*9*(3!)^6)=948 109 639 680
同理得出“块列解”总数与“块行解”一致,L=948 109 639 680
设每个子块都由1到9填充的解共有G=(9!)^9
九宫格内有3个“块行”M=R^3
设满足“块行”限制在满足“子块”限制所占比例为k=M/G
同理满足“块列”限制在满足“子块”限制所占比例也是一样。
假设这两个比例相互独立,同时满足“块行列”限制在满足“子块”限制所占比例约为k^2,
最后可以估算出大约总数为G*(k^2)=6.6571*10^21种。
精确结果为6.671*10^21种,已经相当接近了。
问题二解题思路:
1.将数独所有数字一一保存,需要81byte,进一步可以压缩为40.5byte。
2.时间换空间,只保存8*8方阵的64个数字,其余17个从这64个数推导出来。这样需要32byte。
3.因为已知数独总数约为6.7*10^21个,所有可以用k bit表示每一个不同的数独,k>73,这样只需约8byte,不过这样译码的算法会变得复杂很多。
扩展问题:
如何编码表示一个不完全的数独?
我想到的是稀疏矩阵,大家有更好的方法吗!

在往上级,都是讨论数独的资源:http://www.afjarvis.staff.shef.ac.uk/sudoku/

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts