use ms_toollib::{
cal_all_solution, cal_probability_cells_is_op, cal_probability_cells_not_mine,
cal_probability_csp, cal_probability_enum, cal_probability_onboard, mark_board,
};
#[test]
fn board_1_works() {
let board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 1, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 8, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [10, 10, 54]);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [10, 10, 54]);
}
#[test]
fn board_2_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [0, 10, 64]);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [0, 10, 64]);
}
#[test]
fn board_3_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 10, 57]);
let ans = cal_probability_csp(&board, 0.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 2, 57]);
let ans = cal_probability_csp(&board, 60.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 57, 57]);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 10, 57]);
}
#[test]
fn board_4_works() {
let mut board = vec![
vec![1, 10, 10, 10, 10, 10, 10, 10],
vec![1, 10, 10, 10, 10, 10, 10, 10],
vec![2, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 10, 59]);
assert_eq!(ans.1, 0.14150943396226415);
for (cell, p) in ans.0 {
if cell == (0, 1) {
assert_eq!(p, 0.07547169811320754)
}
if cell == (1, 1) {
assert_eq!(p, 0.9245283018867925)
}
if cell == (2, 1) {
assert_eq!(p, 0.0)
}
if cell == (3, 0) {
assert_eq!(p, 0.5377358490566038)
}
if cell == (3, 1) {
assert_eq!(p, 0.5377358490566038)
}
}
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 10, 59]);
assert_eq!(ans.1, 0.14150943396226415);
for (cell, p) in ans.0 {
if cell == (0, 1) {
assert_eq!(p, 0.07547169811320754)
}
if cell == (1, 1) {
assert_eq!(p, 0.9245283018867925)
}
if cell == (2, 1) {
assert_eq!(p, 0.0)
}
if cell == (3, 0) {
assert_eq!(p, 0.5377358490566039)
}
if cell == (3, 1) {
assert_eq!(p, 0.5377358490566039)
}
}
}
#[test]
fn board_5_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 1, 10, 10, 6, 10, 10],
vec![10, 10, 2, 10, 10, 10, 1, 10],
vec![10, 10, 3, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 5, 10, 10, 10],
vec![10, 2, 10, 10, 10, 10, 1, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let _ = mark_board(&mut board, false);
let ans = cal_probability_csp(&board, 29.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [15, 29, 29]);
let ans = cal_probability_enum(&board, 29.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [15, 29, 29]);
let ans = cal_probability_onboard(&board, 29.0);
println!("{:?}", board);
println!("{:?}", ans);
}
#[test]
fn board_6_works() {
let board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 0.2).unwrap();
println!("{:?}", ans);
assert!(ans.0.is_empty());
assert_eq!(ans.2, [0, 12, 64]);
let ans = cal_probability_enum(&board, 0.2).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [0, 12, 64]);
}
#[test]
fn board_7_works() {
let board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 100.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [0, 64, 64]);
let ans = cal_probability_enum(&board, 100.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [0, 64, 64]);
}
#[test]
fn board_8_works() {
let board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 1.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 2, 57]);
let ans = cal_probability_csp(&board, 100.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 57, 57]);
let ans = cal_probability_enum(&board, 1.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 2, 57]);
let ans = cal_probability_enum(&board, 100.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 57, 57]);
}
#[test]
fn board_9_works() {
let board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let ans = cal_probability_csp(&board, 0.2).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 12, 57]);
let ans = cal_probability_enum(&board, 0.2).unwrap();
println!("{:?}", ans);
assert_eq!(ans.2, [2, 12, 57]);
}
#[test]
fn board_10_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
board[3][2] = 11;
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert!(!ans.0.iter().any(|&(pos, _)| pos == (3, 2)));
assert_eq!(ans.0.len(), 7);
for (_, p) in &ans.0 {
assert!((p - 1.0 / 7.0).abs() < 1e-10);
}
assert_eq!(ans.2, [2, 10, 57]);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
for (pos, p) in &ans.0 {
assert_ne!(pos, &(3, 2));
}
assert_eq!(ans.0.len(), 7);
assert_eq!(ans.2, [2, 10, 57]);
}
#[test]
fn board_11_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
board[3][2] = 12;
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert!(!ans.0.iter().any(|&(pos, _)| pos == (3, 2)));
assert_eq!(ans.0.len(), 7);
for (_, p) in &ans.0 {
assert!((p - 2.0 / 7.0).abs() < 1e-10);
}
assert_eq!(ans.2, [2, 10, 57]);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
assert!(!ans.0.iter().any(|&(pos, _)| pos == (3, 2)));
assert_eq!(ans.0.len(), 7);
for (_, p) in &ans.0 {
assert!((p - 2.0 / 7.0).abs() < 1e-10);
}
assert_eq!(ans.2, [2, 10, 57]);
}
#[test]
fn board_16_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
let chording_cells = vec![(2, 2), (3, 2), (4, 2), (2, 4), (3, 4), (4, 4)];
let p = cal_probability_cells_not_mine(&board, 10 as f64, &chording_cells);
assert_eq!(p * 28.0, 1.0000000000000002);
}
#[test]
fn board_12_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
board[0][0] = 12;
board[7][7] = 12;
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
assert!(!ans.0.iter().any(|&(pos, _)| pos == (0, 0)));
assert!(!ans.0.iter().any(|&(pos, _)| pos == (7, 7)));
assert_eq!(ans.0.len(), 62);
for (_, p) in &ans.0 {
assert!((p - 10.0 / 62.0).abs() < 1e-10);
}
assert_eq!(ans.2, [0, 10, 62]);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
assert_eq!(ans.0.len(), 0);
assert!((ans.1 - 10.0 / 62.0).abs() < 1e-10);
assert_eq!(ans.2, [0, 10, 62]);
}
#[test]
fn board_13_works() {
let mut board = vec![
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 2, 10, 10, 10, 10],
vec![10, 10, 10, 3, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
vec![10, 10, 10, 10, 10, 10, 10, 10],
];
board[3][2] = 11;
board[0][0] = 11;
board[3][1] = 11;
board[6][6] = 12;
board[6][6] = 12;
board[7][0] = 12;
let ans = cal_probability_csp(&board, 10.0).unwrap();
println!("{:?}", ans);
let ans = cal_probability_enum(&board, 10.0).unwrap();
println!("{:?}", ans);
}
#[test]
fn csp_prob_gt_1() {
let board: Vec<Vec<i32>> = vec![
vec![
2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 1, 0, 1, 1,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 3, 1, 3, 11,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 3, 10, 10, 11, 4, 11, 4, 11,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 5, 11, 2, 1, 3, 11, 4, 11, 3, 1,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 2, 1, 0, 1, 1, 2, 1, 1, 0,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 2, 1, 0, 0, 0, 1, 1, 1, 0,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 2, 3, 11, 2, 0, 0, 0, 1, 11, 2, 1,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 1, 2, 11, 4, 3, 2, 2, 2, 3, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 2, 2, 3, 11, 11, 11, 4, 11, 3, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 2, 10, 4, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 3, 3, 2, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
vec![
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
],
];
let ans = cal_probability_csp(&board, 540.0).unwrap();
for &((r, c), p) in &ans.0 {
assert!(
p <= 1.0 + 1e-12,
"CSP probability > 1 at ({},{}): {}",
r,
c,
p
);
}
}