class Solution {
public:
int minimumOperations(vector<int>& nums, int start, int goal) {
auto op1 = [](int x, int y) -> int { return x + y; };
auto op2 = [](int x, int y) -> int { return x - y; };
auto op3 = [](int x, int y) -> int { return x ^ y; };
vector<function<int(int, int)>> ops = {op1, op2, op3};
vector<int> vis(1001, 0);
queue<int> q;
q.push(start);
int step = 0;
while (!q.empty()) {
int n = q.size();
for (int i = 0; i < n; i++) {
int x = q.front(); q.pop();
for (auto num : nums) {
for (auto & op : ops) {
int nx = op(x, num);
if (nx == goal) {
return step + 1;
}
if (nx >= 0 && nx <= 1000 && !vis[nx]) {
q.push(nx);
vis[nx] = 1;
}
}
}
}
step++;
}
return -1;
}
};