此遥控器包含12个按键和2个非功能键。每个功能键都有一个唯一的标签,如上所示。 这个控制台的电脑游戏有N级。游戏中有一些使用遥控器控制的动作。每个移动的键随着级别的数量而变化,即操作的键数取决于游戏级别,例如对于第三级,单次移动需要三个键[您必须按顺序按三个键才能进行第三次移动水平]。玩家只能按下左,右,上或下按键到当前按键,并且不允许他按下底行角键。
假设玩家处于2级。根据规则,他必须按2键进行移动(键的数量等于等级)。可能的Moves键将是'HH','HI','HG','HE','HJ','IF',...等等
如果Move从'J'开始,可能的键是'JJ','JH'(计数2)
如果Move从'H'开始,可能的键是'HH','HI','HG','HE','HJ'(计数5)
如果Move从'I'开始,可能的键是'II','IH','IF'(计数3)
因此,对于第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, 任何人都可以拥有最佳的解决方案。 请帮助我
答案 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的所有邻居开始的所有可能序列。