while last_dp[target_state] == INF: dp = last_dp.copy() for state inrange(max_state): if last_dp[state] == INF: continue for i inrange(9): new_state = state for to in link_map[i]: if state & there_map[to] == there_map[to]: new_state ^= there_map[to] else: new_state += one_map[to] if last_dp[state] + 1 < dp[new_state]: dp[new_state] = last_dp[state] + 1 anc[new_state] = (i, state) last_dp = dp.copy()
there_map = [3 << (i * 2) for i inrange(9)] one_map = [1 << (i * 2) for i inrange(9)] link_map = [[] for _ inrange(9)] for i inrange(9): for j inrange(9): ix, iy = i // 3, i % 3 jx, jy = j // 3, j % 3 if ix == jx: link_map[i].append(j) elif iy == jy: link_map[i].append(j)
start_state = 0 target_state = 0 for i, item inenumerate(start_map): start_state |= item << (i * 2) target_state |= target << (i * 2)
while last_dp[target_state] == INF: dp = last_dp.copy() for state inrange(max_state): if last_dp[state] == INF: continue for i inrange(9): new_state = state for to in link_map[i]: if state & there_map[to] == there_map[to]: new_state ^= there_map[to] else: new_state += one_map[to] if last_dp[state] + 1 < dp[new_state]: dp[new_state] = last_dp[state] + 1 anc[new_state] = (i, state) last_dp = dp.copy()
new_vis = 0 for state inrange(max_state): if last_dp[state] != INF: new_vis += 1