Untitled
unknown
plain_text
6 months ago
3.2 kB
3
Indexable
#include <bits/stdc++.h> using namespace std; // Function to find the minimum number of steps to reach the final state int balance_water(vector<int> elements) { // Extract capacities, initial states, and final states from the input vector<int> caps(4), initial(4), final(4); for (int i = 0; i < 4; ++i) { caps[i] = elements[i]; // capacities } for (int i = 0; i < 4; ++i) { initial[i] = elements[i + 4]; // initial water contents } for (int i = 0; i < 4; ++i) { final[i] = elements[i + 8]; // final water contents } // Define the initial and final state tuple<int, int, int, int> initialState = {initial[0], initial[1], initial[2], initial[3]}; tuple<int, int, int, int> finalState = {final[0], final[1], final[2], final[3]}; // Check if the total water is the same if (accumulate(initial.begin(), initial.end(), 0) != accumulate(final.begin(), final.end(), 0)) { return -1; // Impossible if the total amount of water doesn't match } // BFS setup queue<pair<tuple<int, int, int, int>, int>> q; // (state, steps) set<tuple<int, int, int, int>> visited; // Initial state q.push({initialState, 0}); visited.insert(initialState); while (!q.empty()) { auto [currentState, steps] = q.front(); q.pop(); // Check if we reached the final state if (currentState == finalState) { return steps; // Return the number of steps taken } // Explore all possible moves for (int i = 0; i < 4; ++i) { // From each jug for (int j = 0; j < 4; ++j) { // To each jug if (i != j) { // Cannot pour into the same jug int currentContents[4]; tie(currentContents[0], currentContents[1], currentContents[2], currentContents[3]) = currentState; // Calculate the amount to pour int pourAmount = min(currentContents[i], caps[j] - currentContents[j]); if (pourAmount > 0) { // Create a new state int newContents[4] = {currentContents[0], currentContents[1], currentContents[2], currentContents[3]}; newContents[i] -= pourAmount; newContents[j] += pourAmount; // Create a new state tuple tuple<int, int, int, int> newState = {newContents[0], newContents[1], newContents[2], newContents[3]}; if (visited.find(newState) == visited.end()) { visited.insert(newState); q.push({newState, steps + 1}); } } } } } } return -1; // If the final state is not reachable } int main() { // Example input array (change these values as needed) vector<int> elements = {5, 7, 9, 12, 1, 2, 3, 4, 4, 3, 2, 1}; // capacities, initial, final // Call the balance_water function int result = balance_water(elements); // Output the result cout << result << endl; return 0; }
Editor is loading...
Leave a Comment