fix: wrong validations
fix: overflows
This commit is contained in:
parent
ad99a5663d
commit
75f3c7ad60
2 changed files with 112 additions and 10 deletions
|
@ -6,6 +6,7 @@ edition = "2021"
|
||||||
[profile.release]
|
[profile.release]
|
||||||
strip = "symbols"
|
strip = "symbols"
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
overflow-checks = true
|
||||||
lto = true
|
lto = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
121
src/main.rs
121
src/main.rs
|
@ -22,10 +22,16 @@ fn main() {
|
||||||
let c:u8 = c.trim().parse().unwrap();
|
let c:u8 = c.trim().parse().unwrap();
|
||||||
|
|
||||||
println!("\n\tA = {}\n\tB = {}\n\tC = {}", a,b,c);
|
println!("\n\tA = {}\n\tB = {}\n\tC = {}", a,b,c);
|
||||||
|
if a <= 0 || b <= 0 || c <= 0
|
||||||
|
{
|
||||||
|
println!("Exit: Zero as a Input Invalid");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let mut max_needs_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT];
|
let mut max_needs_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT];
|
||||||
let mut assigned_resources_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT];
|
let mut assigned_resources_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT];
|
||||||
let mut info:(bool, Vec<u8>) = (false, Vec::with_capacity(PROCESS_COUNT));
|
let mut info:(bool, Vec<u8>) = (false, Vec::with_capacity(PROCESS_COUNT));
|
||||||
|
let mut count:u128 = 0;
|
||||||
while !info.0
|
while !info.0
|
||||||
{
|
{
|
||||||
for i in 0..PROCESS_COUNT
|
for i in 0..PROCESS_COUNT
|
||||||
|
@ -71,7 +77,9 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
info = banker(a, b, c, max_needs_matrix, assigned_resources_matrix);
|
info = banker(a, b, c, max_needs_matrix, assigned_resources_matrix);
|
||||||
|
count += 1;
|
||||||
}
|
}
|
||||||
|
println!("Count = {}", count);
|
||||||
println!("Max Needs Matrix");
|
println!("Max Needs Matrix");
|
||||||
print_matrix(max_needs_matrix);
|
print_matrix(max_needs_matrix);
|
||||||
println!("Assigned Resources Matrix");
|
println!("Assigned Resources Matrix");
|
||||||
|
@ -138,13 +146,47 @@ fn banker(a:u8, b:u8, c:u8, max_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT]
|
||||||
let mut remaining_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT] = [[0;RESOURCE_COUNT];PROCESS_COUNT];
|
let mut remaining_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT] = [[0;RESOURCE_COUNT];PROCESS_COUNT];
|
||||||
for i in 0..PROCESS_COUNT
|
for i in 0..PROCESS_COUNT
|
||||||
{
|
{
|
||||||
a_remaing += assigned_resources_matrix[i][0];
|
match a_remaing.checked_add(assigned_resources_matrix[i][0])
|
||||||
b_remaing += assigned_resources_matrix[i][1];
|
{
|
||||||
c_remaing += assigned_resources_matrix[i][2];
|
Some(result) =>
|
||||||
|
{
|
||||||
|
a_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match b_remaing.checked_add(assigned_resources_matrix[i][1])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
b_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match c_remaing.checked_add(assigned_resources_matrix[i][2])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
c_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
remaining_needs_matrix[i][0] = max_needs_matrix[i][0] - assigned_resources_matrix[i][0];
|
remaining_needs_matrix[i][0] = max_needs_matrix[i][0] - assigned_resources_matrix[i][0];
|
||||||
remaining_needs_matrix[i][1] = max_needs_matrix[i][1] - assigned_resources_matrix[i][1];
|
remaining_needs_matrix[i][1] = max_needs_matrix[i][1] - assigned_resources_matrix[i][1];
|
||||||
remaining_needs_matrix[i][2] = max_needs_matrix[i][2] - assigned_resources_matrix[i][2];
|
remaining_needs_matrix[i][2] = max_needs_matrix[i][2] - assigned_resources_matrix[i][2];
|
||||||
}
|
}
|
||||||
|
if a_remaing > a || b_remaing > b || c_remaing > c
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
a_remaing = a - a_remaing;
|
a_remaing = a - a_remaing;
|
||||||
b_remaing = b - b_remaing;
|
b_remaing = b - b_remaing;
|
||||||
c_remaing = c - c_remaing;
|
c_remaing = c - c_remaing;
|
||||||
|
@ -161,12 +203,72 @@ fn banker(a:u8, b:u8, c:u8, max_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT]
|
||||||
{
|
{
|
||||||
if a_remaing >= remaining_needs_matrix[i][0] && b_remaing >= remaining_needs_matrix[i][1] && c_remaing >= remaining_needs_matrix[i][2]
|
if a_remaing >= remaining_needs_matrix[i][0] && b_remaing >= remaining_needs_matrix[i][1] && c_remaing >= remaining_needs_matrix[i][2]
|
||||||
{
|
{
|
||||||
a_remaing -= remaining_needs_matrix[i][0];
|
match a_remaing.checked_sub(remaining_needs_matrix[i][0])
|
||||||
a_remaing += max_needs_matrix[i][0];
|
{
|
||||||
b_remaing -= remaining_needs_matrix[i][1];
|
Some(result) =>
|
||||||
b_remaing += max_needs_matrix[i][1];
|
{
|
||||||
c_remaing -= remaining_needs_matrix[i][2];
|
a_remaing = result;
|
||||||
c_remaing += max_needs_matrix[i][2];
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false , vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match a_remaing.checked_add(max_needs_matrix[i][0])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
a_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match b_remaing.checked_sub(remaining_needs_matrix[i][1])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
b_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false , vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match b_remaing.checked_add(max_needs_matrix[i][1])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
b_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match c_remaing.checked_sub(remaining_needs_matrix[i][2])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
c_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false , vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match c_remaing.checked_add(max_needs_matrix[i][2])
|
||||||
|
{
|
||||||
|
Some(result) =>
|
||||||
|
{
|
||||||
|
c_remaing = result;
|
||||||
|
}
|
||||||
|
None =>
|
||||||
|
{
|
||||||
|
return (false, vec![]);
|
||||||
|
}
|
||||||
|
}
|
||||||
done[i] = true;
|
done[i] = true;
|
||||||
q.push(i as u8);
|
q.push(i as u8);
|
||||||
infinite_detection = 2;
|
infinite_detection = 2;
|
||||||
|
@ -178,6 +280,5 @@ fn banker(a:u8, b:u8, c:u8, max_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT]
|
||||||
return (false, q);
|
return (false, q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//println!("{}{}{}", a_remaing, b_remaing, c_remaing);
|
|
||||||
(true, q)
|
(true, q)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue