java中的游戏,解决方案不适用于n> 3

时间:2017-11-30 06:56:06

标签: java

此遥控器包含12个按键和2个非功能键。每个功能键都有一个唯一的标签,如上所示。 这个控制台的电脑游戏有N级。游戏中有一些使用遥控器控制的动作。每个移动的键随着级别的数量而变化,即操作的键数取决于游戏级别,例如对于第三级,单次移动需要三个键[您必须按顺序按三个键才能进行第三次移动水平]。玩家只能按下左,右,上或下按键到当前按键,并且不允许他按下底行角键。

enter image description here

假设玩家处于2级。根据规则,他必须按2键进行移动(键的数量等于等级)。可能的Moves键将是'HH','HI','HG','HE','HJ','IF',...等等

  1. 如果Move从'J'开始,可能的键是'JJ','JH'(计数2)

  2. 如果Move从'H'开始,可能的键是'HH','HI','HG','HE','HJ'(计数5)

  3. 如果Move从'I'开始,可能的键是'II','IH','IF'(计数3)

  4. 因此,对于第2级,可能的移动次数将为36。

    如果玩家处于N级,则必须找到该级别的总移动次数。

    输入/输出规格

    输入规格:

    输入是一个整数N,它是游戏的等级

    输出规格:

    输出是整数M,它是可能的总移动次数

    实施例

    输入:2

    输出:36

    说明

    1)不要写主要功能。

    2)您可以在代码的任何步骤打印和调试代码。

    3)您需要从给定函数返回所需的输出。

    4)不要更改编辑器代码中给出的功能和参数名称。

    5)返回类型必须与问题陈述中提到的相同。

    6)当您提交代码时,在后台执行10个不同复杂程度的测试用例,并根据传递的测试用例数给出标记。

    7)如果您不打算一次性完成代码,请将您的工作保存在本地计算机上。只有在使用“提交”按钮提交代码时才会保存代码。

    8)只允许提交两份。

    使用System;

    public class CandidateCode {
    
        public static int combinationCounts(int input1) {
    
            //Write code here
    
        }
    
    }
    

    嗯所以我遇到了这个问题,我得到了解决方案

        public static int combinationCounts(int input1)
        {
         final int TOT_KEYS=12;
         final int WORKING_KEYS=10;
         int moves=input1;
         return(TOT_KEYS*moves+moves+WORKING_KEYS);
        }
    
      public static void main(String[] args) throws IOException{
            Scanner in = new Scanner(System.in);
            int output = 0;
            int ip1 = Integer.parseInt(in.nextLine().trim());
            output = combinationCounts(ip1);
            System.out.println(String.valueOf(output));
        }
    }
    

    此代码仅适用于n = 2但不适用于3, 任何人都可以拥有最佳的解决方案。 请帮助我

2 个答案:

答案 0 :(得分:0)

这需要使用Graphs来解决。您应该在其中定义一个 Node 类,其中包含 Neighbors 变量数组。然后,对于每个密钥,您需要定义一个包含邻居的Node实例。邻居数组的大小是可能的下一步动作。您需要为密钥本身添加一个大小。

计数组合意味着计数路径。所以N在这里意味着深度。当您看到深度时,意味着 combinationCounts 方法将是递归方法。尝试每次用n-1调用combinationCounts,直到N等于零。

方法看起来像这样;

public static int combinationCounts(int input1) {
        if(input1 == 0){
          return 0;
        }
        int totalPaths =0;
        for(Node key : keys){
            totalPaths = (key.neighbours.size() + 1) + combinationCounts(input1 -1);
        }
        return totalPaths;
  }

答案 1 :(得分:0)

#include<bits/stdc++.h>
using namespace std;

int main() 
{ 
    // your code goes here 
    //ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    int n;
    cin>>n;
    int dp[10][16];
    vector<int> neighbours[10];
    neighbours[0]={0, 1, 3};
    neighbours[1]={0, 1, 2, 4};
    neighbours[2]={1, 2, 5};
    neighbours[3]={0, 3, 4, 6};
    neighbours[4]={1, 3, 4, 5, 7};
    neighbours[5]={2, 4, 5, 8};
    neighbours[6]={3, 6, 7};
    neighbours[7]={4, 6, 7, 8, 9};
    neighbours[8]={5, 7, 8};
    neighbours[9]={7, 9};
    
    for(int i=0; i<10; i++)
    {
        dp[i][1]=1;
    }
    for(int lv=2; lv<=n; lv++)
    {
        for(int i=0; i<10; i++)
        {
            dp[i][lv]=0;
            for(int j=0; j<neighbours[i].size(); j++)
            {
                dp[i][lv]+=dp[neighbours[i][j]][lv-1];
            }
        }
    }
    int ans=0;
    for(int i=0; i<10; i++)
    {
        //cout<<i<<"->"<<dp[i][n]<<"\n";
        ans+=dp[i][n];
    }
    cout<<ans;
} 

使用dp解决。 0表示A,1表示B .........,9表示J。

从级别'lv'的给定键'i'开始的可能序列数=从级别'lv-1'的i的所有邻居开始的所有可能序列。