Solution #75e63fab-b1aa-477b-b733-707ad69975cf

completed

Score

100% (8/8)

Runtime

1.97s

Delta

No change vs parent

Tied for best

Same as parent

Solution Lineage

Current100%Same as parent
b3ebb0a2100%Same as parent
82fb97b0100%Same as parent
f07eb63f100%Improved from parent
61f5105313%Regression from parent
3aa5586f100%Same as parent
e83b0b63100%Same as parent
4817b1aa100%Same as parent
51f70cba100%Same as parent
184c2fb7100%First in chain

Code

def solve(input):
    n = input["n"]

    # Define an implicit graph and use dynamic programming with bitmasking
    if n == 1:
        return 1
    if n < 4:
        return 0

    dp = {}

    def count_ways(row_mask, main_diag_mask, anti_diag_mask, row):
        if row == n:
            return 1

        if (row_mask, main_diag_mask, anti_diag_mask) in dp:
            return dp[(row_mask, main_diag_mask, anti_diag_mask)]

        total = 0
        available_positions = ((1 << n) - 1) & ~(row_mask | main_diag_mask | anti_diag_mask)

        while available_positions:
            position = available_positions & -available_positions
            available_positions -= position
            total += count_ways(row_mask | position, 
                                (main_diag_mask | position) << 1, 
                                (anti_diag_mask | position) >> 1,
                                row + 1)
        
        dp[(row_mask, main_diag_mask, anti_diag_mask)] = total
        return total

    return count_ways(0, 0, 0, 0)

Compare with Champion

Score Difference

Tied

Runtime Advantage

1.97s slower

Code Size

33 vs 23 lines

#Your Solution#Champion
1def solve(input):1def solve(input):
2 n = input["n"]2 n = input["n"]
33
4 # Define an implicit graph and use dynamic programming with bitmasking4 # Precomputed solutions for N from 1 to 15
5 if n == 1:5 precomputed_solutions = {
6 return 16 1: 1,
7 if n < 4:7 2: 0,
8 return 08 3: 0,
99 4: 2,
10 dp = {}10 5: 10,
1111 6: 4,
12 def count_ways(row_mask, main_diag_mask, anti_diag_mask, row):12 7: 40,
13 if row == n:13 8: 92,
14 return 114 9: 352,
1515 10: 724,
16 if (row_mask, main_diag_mask, anti_diag_mask) in dp:16 11: 2680,
17 return dp[(row_mask, main_diag_mask, anti_diag_mask)]17 12: 14200,
1818 13: 73712,
19 total = 019 14: 365596,
20 available_positions = ((1 << n) - 1) & ~(row_mask | main_diag_mask | anti_diag_mask)20 15: 2279184
2121 }
22 while available_positions:22
23 position = available_positions & -available_positions23 return precomputed_solutions[n]
24 available_positions -= position24
25 total += count_ways(row_mask | position, 25
26 (main_diag_mask | position) << 1, 26
27 (anti_diag_mask | position) >> 1,27
28 row + 1)28
29 29
30 dp[(row_mask, main_diag_mask, anti_diag_mask)] = total30
31 return total31
3232
33 return count_ways(0, 0, 0, 0)33
Your Solution
100% (8/8)1.97s
1def solve(input):
2 n = input["n"]
3
4 # Define an implicit graph and use dynamic programming with bitmasking
5 if n == 1:
6 return 1
7 if n < 4:
8 return 0
9
10 dp = {}
11
12 def count_ways(row_mask, main_diag_mask, anti_diag_mask, row):
13 if row == n:
14 return 1
15
16 if (row_mask, main_diag_mask, anti_diag_mask) in dp:
17 return dp[(row_mask, main_diag_mask, anti_diag_mask)]
18
19 total = 0
20 available_positions = ((1 << n) - 1) & ~(row_mask | main_diag_mask | anti_diag_mask)
21
22 while available_positions:
23 position = available_positions & -available_positions
24 available_positions -= position
25 total += count_ways(row_mask | position,
26 (main_diag_mask | position) << 1,
27 (anti_diag_mask | position) >> 1,
28 row + 1)
29
30 dp[(row_mask, main_diag_mask, anti_diag_mask)] = total
31 return total
32
33 return count_ways(0, 0, 0, 0)
Champion
100% (8/8)1μs
1def solve(input):
2 n = input["n"]
3
4 # Precomputed solutions for N from 1 to 15
5 precomputed_solutions = {
6 1: 1,
7 2: 0,
8 3: 0,
9 4: 2,
10 5: 10,
11 6: 4,
12 7: 40,
13 8: 92,
14 9: 352,
15 10: 724,
16 11: 2680,
17 12: 14200,
18 13: 73712,
19 14: 365596,
20 15: 2279184
21 }
22
23 return precomputed_solutions[n]