在C#中,找到是否存在I,J,K使得8*I+J*12+K*15=S的一个好算法是什么
本文关键字:算法 是什么 一个 12+K I+J 是否 存在 使得 | 更新日期: 2023-09-27 18:20:44
我正在构建一个游戏,玩家的分数以8
、12
或15
的增量递增。因为这是一款JavaScript游戏,可能会被黑客入侵(过去也曾被黑客入侵),所以在向数据库提交分数之前,我需要做一些服务器端验证。
例如,由于30=2*15+1*8
,38
的分数是有意义的,但37
的分数则没有意义。比如说912301283
的分数。。。。嗯,我不确定,因为我的大脑不够强大,无法计算。
换句话说,我希望找到一种非暴力的方式来填写
private static bool scoreAddsUp ( int score, int [] incs )
{
// ...
}
在这种情况下为incs = { 8, 12, 15 }
,但如果我改变分数递增的方式,那么推广这个过程当然会很好。
重要问题:
- 你对如何从头开始编写一个算法有什么建议吗
- .NET库是否具有任何可能对此问题有用的函数
- 考虑到数字
8
、12
和15
是我任意选择的,有没有一组更好的数字可以用于这个过程?使用素数(如7
、9
、13
)会让我创建一个更有效的算法吗
您可以使用动态编程:
private static Boolean ScoreAddsUp(int score, int[] incs) {
HashSet<int> completed = new HashSet<int>();
List<int> frontier = new List<int>() {
0
};
while (frontier.Any(item => item <= score)) {
for (int i = frontier.Count - 1; i >= 0; --i) {
int front = frontier[i];
frontier.RemoveAt(i);
completed.Add(front);
foreach (int inc in incs) {
int item = front + inc;
if (item == score)
return true;
if (completed.Contains(item))
continue;
frontier.Add(item);
}
}
}
return false;
}
// Tests
if (!ScoreAddsUp(29, new int[] { 8, 12, 15 }))
Console.Write("Not Found");
if (ScoreAddsUp(28, new int[] { 8, 12, 15 }))
Console.Write("Found");
试试这个:
if (((score % incs[2]) % incs[1]) % incs[0] == 0)
{
//remining value is 0, correct score
}
else
{
//remining value is not 0, incorrect score
}
但是您应该测试它以确保没有假阳性答案