【发布时间】:2016-05-24 19:17:49
【问题描述】:
我试图在 HackerRank 上解决这个问题几个小时。基本问题陈述如下:
您有一个仅由 0s 和 1s 组成的一维数组。您从第 0 个索引开始。 让我们假设数组的大小为n。如果您可以超出数组的范围(即索引> n-1),您将获胜。但你只能通过两种方式移动:
- 向前或向后走一步。
- 向前跳跃正好 'm' 长度。
另外,您只能踩到值为 0 的元素。 第 0 个索引处的值已知为 0。(因此您从有效位置开始)
'm' 作为输入提供,它可以是 0 到 100 之间的任何值(包括 0 到 100)。 数组大小可以是 2 到 100 之间的任何值。
如果有可能获胜,程序应该打印“YES”。否则“否”。
我尝试使用 Java 中的回溯算法来解决它。但它在大多数测试用例中都会被拒绝。
请帮助我。提前致谢。
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int[] array = new int[n];
for(int i=0;i<n;i++){
array[i]=sc.nextInt();
}
if(m<2){
for(int i=0;i<n;i++){
if(array[i] == 1){
System.out.println("NO");
break;
}
}
System.out.println("YES");
}
else{
if(isSolvable(array,0,m,n))
{System.out.println("YES");}
else
{System.out.println("NO");}
}
}
static boolean isSolvable(int[] array,int x,int m,int n){
if(x>n-1){
//System.out.print(x + " ");
return true;
}
if(array[x] == 1) return false;
if(isSolvable(array,x+m,m,n)){
//System.out.print(x + " ");
return true;
}
if(isSolvable(array,x+1,m,n)){
//System.out.print(x + " ");
return true;
}
return false;
}
}
【问题讨论】:
标签: java arrays backtracking