在C#中,找到是否存在I,J,K使得8*I+J*12+K*15=S的一个好算法是什么

本文关键字:算法 是什么 一个 12+K I+J 是否 存在 使得 | 更新日期: 2023-09-27 18:20:44

我正在构建一个游戏,玩家的分数以81215的增量递增。因为这是一款JavaScript游戏,可能会被黑客入侵(过去也曾被黑客入侵),所以在向数据库提交分数之前,我需要做一些服务器端验证。

例如,由于30=2*15+1*838的分数是有意义的,但37的分数则没有意义。比如说912301283的分数。。。。嗯,我不确定,因为我的大脑不够强大,无法计算。

换句话说,我希望找到一种非暴力的方式来填写

private static bool scoreAddsUp ( int score, int [] incs )
{
   // ...
}

在这种情况下为incs = { 8, 12, 15 },但如果我改变分数递增的方式,那么推广这个过程当然会很好。

重要问题:

  • 你对如何从头开始编写一个算法有什么建议吗
  • .NET库是否具有任何可能对此问题有用的函数
  • 考虑到数字81215是我任意选择的,有没有一组更好的数字可以用于这个过程?使用素数(如7913)会让我创建一个更有效的算法吗

在C#中,找到是否存在I,J,K使得8*I+J*12+K*15=S的一个好算法是什么

您可以使用动态编程:

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
}

但是您应该测试它以确保没有假阳性答案