我正在解决Hackerrank上的问题,你可以在 - https://www.hackerrank.com/challenges/journey-to-the-moon
上阅读使用以下代码
输出不正确我已在该代码中实现了所有必需的数据结构,并尝试创建连接组件的大小数组。
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String[] temp = bfr.readLine().split(" ");
int N = Integer.parseInt(temp[0]);
int I = Integer.parseInt(temp[1]);
Solution sol=new Solution();
Graph g = sol.new Graph(N);
for(int i = 0; i < I; i++){
temp = bfr.readLine().split(" ");
int a = Integer.parseInt(temp[0]);
int b = Integer.parseInt(temp[1]);
g.addEdge(a,b);
// Store a and b in an appropriate data structure of your choice
}
CC ccg=sol.new CC(g);
int len=ccg.getComp();
long combinations = 0;
for(int k=0;k<len;k++){
if(k==0){
combinations+=ccg.getNum(k);
}else{
combinations*=ccg.getNum(k);
}
}
// Compute the final answer - the number of combinations
System.out.println(combinations);
}
class Graph{
final int s;
Bag[] adj;
public Graph(int si){
s=si;
adj=new Bag[s];
for(int i=0;i<si;i++){
adj[i]=new Bag();
}
}
public void addEdge(int i,int j){
adj[i].add(j);
adj[j].add(i);
}
public int graphSize(){
return s;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
}
class Bag implements Iterable<Integer>{
Node first;
int size=0;
final class Node{
int i;
Node next;
}
public void add(int x){
Node old=first;
first=new Node();
first.i=x;
first.next=old;
size++;
}
public int getSize(){
return size;
}
public Iterator<Integer> iterator() {
// TODO Auto-generated method stub
return new ListIterator();
}
public class ListIterator implements Iterator<Integer>{
private Node current=first;
public boolean hasNext(){
return current!=null;
}
public void remove(){}
public Integer next(){
int i=current.i;
current=current.next;
return i;
}
}
}
class CC{
private boolean[] marked;
private int[] id;
private int[] comp;
private int count=0;
public CC(Graph g){
int i=g.graphSize();
marked=new boolean[i];
id=new int[i];
comp=new int[i];
for(int j=0;j<i;j++){
comp[j]=0;
}
for(int v=0;v<i;v++){
if(!marked[v]){
dfs(g,v);
count++;
}
comp[count]=comp[count]+1;
}
}
public int getComp(){
return count;
}
public int getNum(int i){
return comp[i];
}
private void dfs(Graph g,int v){
marked[v]=true;
id[v]=count;
for(int w:g.adj[v]){
if(!marked[w]){
dfs(g,w);
}
}
}
}
}
答案 0 :(得分:3)
我已完成了几个程序的测试运行。
在所有运行中,程序打印0.虽然在某些情况下0是正确的输出,但在我的所有情况下都不是正确的输出。所以这可能是Hackerrank关闭程序的一个原因。示例输入:
3 1
0 2
我的意思是描述两个来自一个国家的宇航员0和2以及来自其他国家的宇航员1的国家。
预期输出:2
。程序的实际输出:0
。
(我已编辑此段。)似乎如果所有对都A
等于B
,您将获得ArrayIndexOutOfBoundsException
。例如:
1 1
0 0
我在Hackerrank规则中没有看到任何禁止A == B
的内容,所以我想你应该考虑到它。
正如我在评论中所说,我并没有深入研究你的程序,以了解它为何如我所描述的那样行事;我只是观察并向你汇报。我将把调试留给自己。