第一行输入整数
—— 测试组数。
接下来
行,每行输入
个整数
。
对每组数据输出一个整数,表示最少操作次数。
2 10 100 200 300 10 10 10 10
5 0
样例1:
第一组测试数据,可能的操作是:
初始
将弹药增加,变成
将弹药减少,变成
将钢材增加到上限,变成
将钢材减少,变成
将铝增加到上限,变成
可以发现无法使用次以下的操作来达到开发所需的资源量,所以答案为
。
第二组测试数据,开发所需的资源量就为资源初始值,所以不需要进行任何操作。
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
vector<int> step_mini(305, -1);
int op(int num, int x) {
if (x == 1) return num + 1;
else if (x == 2) return num - 1;
else if (x == 3) return num + 10;
else if (x == 4) return num - 10;
else if (x == 5) return num + 100;
else if (x == 6) return num - 100;
else if (x == 7) return 300;
else if (x == 8) return 10;
else{
cout << "????";
return 1;
};
}
void BFS(int start) {
queue<int> q;
set<int> visited;
int step = 0;
q.push(start);
visited.insert(start);
while (!q.empty()) {
int sz = q.size();
for (int k = 0; k < sz; k++) {
int cur = q.front();
q.pop();
for (int i = 1; i <= 8; i++) {
int nex = op(cur, i);
if (nex >= 10 && nex <= 300 && !visited.count(nex)) {
q.push(nex);
visited.insert(nex);
if(step_mini[nex] == -1)step_mini[nex] = step + 1;
}
}
}
step++;
}
}
int main() {
step_mini[10] = 0;
int T;
cin >> T;
BFS(10);
while (T--) {
int sum = 0;
for(int i = 0; i < 4; i++){
int x;
cin >> x;
sum += step_mini[x];
}
cout << sum << endl;
}
}
// 64 位输出请用 printf("%lld") 打表
package main
import (
"fmt"
)
type Node struct{
value, step int
}
var result [301]int // 存储10到其他数值所需的操作次数
func BFS() { // 计算10到其他数值所需的操作次数
for i:=0;i<=300;i++{
result[i] = -1
}
queue := []Node{{10,0}}
result[10]=0
var cur Node
var dist []int
for len(queue) > 0{
cur = queue[0]
queue = queue[1:]
dist = []int{
cur.value-1,cur.value+1,
cur.value+100,cur.value-100,
cur.value+10, cur.value-10,
10, 300,
}
for _, d := range dist {
if d < 10 || d >300 || result[d] != -1{
continue
}
result[d] = cur.step + 1
queue = append(queue, Node{d, cur.step+1})
}
}
}
func main() {
var a, b, c, d int
var t int
fmt.Scanf("%d", &t)
BFS()
for t >0 {
t--
fmt.Scanf("%d %d %d %d", &a, &b, &c, &d)
fmt.Println(result[a]+result[b]+result[c]+result[d])
}
}