オンラインプログラミングの問題を解決しようとしています(http://acm.timus.ru/problem.aspx?space=1&num=1002)。
ただし、最初の入力データを次のように試すときはいつでも:
7325189087(解読するための呼び出し番号) 20(入力する単語の総数) ...(ここに入力20行までの単語)
Javaコンソールは、20行目以降に応答/ハングしません。エラーが発生している場所を誰かが指摘するのを手伝ってもらえますか?ScannerとBufferedReaderの両方、およびWindowsコマンドプロンプトとJCreatorのコマンドラインを試しましたが、役に立ちませんでした。
コードは次のとおりです。
import java.util.*;
import java.io.*;
class PhoneNumbers {
static List<String> cmb = new ArrayList<String>();
static List<String> indices = new ArrayList<String>();
static List<String> outputs = new ArrayList<String>();
public static void main(String[] args) throws IOException{
//BufferedReader in = new BufferedReader(new InputStreamReader((System.in)));
Scanner in = new Scanner(new BufferedInputStream(System.in));
String inp = "";
while(true) {
System.out.print(" ");
inp = in.nextLine();
if(inp.equals("-1")) break;
System.out.print(" ");
int loops = Integer.parseInt(in.nextLine());
//String[] words = new String[loops];
List<String> words = new ArrayList<String>();
for(int i = 0; i < loops; i++){
System.out.print(" ");
words.add(in.nextLine()); //Error occurs here. if loop is 20 line or more.
}
String nums = "";
for(int i = 0; i < words.size(); i++)
nums += i;
Combi("",nums,words,inp.length());
boolean isfound = false;
String ind = "";
int len = 100;
for(int i = 0; i < cmb.size(); i++){
String result = "";
for(int i2 = 0; i2 < cmb.get(i).length(); i2++) {
result += getVal((cmb.get(i).charAt(i2) + "").toLowerCase());
}
if(inp.equals(result)) {
isfound = true;
int len2 = indices.get(i).length();
if(len2 < len){
len = len2;
ind = indices.get(i);
}
}
}
if(isfound){
String out = "";
for(int i = 0; i < ind.length(); i++) {
int x = Integer.parseInt(ind.charAt(i) + "");
out += words.get(x);
if(i < ind.length() - 1)
out += " ";
}
outputs.add(out);
}
else
outputs.add("No solution.");
cmb.clear();
indices.clear();
}
cmb.clear();
indices.clear();
for(int i = 0; i < outputs.size(); i++)
System.out.println(outputs.get(i));
}
public static void Combi(String pre, String s, List<String> col, int len) {
if(!pre.equals("")){
String nval = "";
for(int i = 0; i < pre.length(); i++){
nval += col.get(Integer.parseInt(pre.charAt(i) + ""));
}
if(nval.length() == len){
cmb.add(nval);
indices.add(pre);
Perm("",pre,col,len);
}
}
for(int i = 0; i < s.length(); i++)
Combi(pre + s.charAt(i), s.substring(i + 1),col,len);
}
public static void Perm(String pre, String s, List<String> col, int len) {
int n = s.length();
if(n == 0){
String nval = "";
for(int i = 0; i < pre.length(); i++){
nval += col.get(Integer.parseInt(pre.charAt(i) + ""));
}
if(cmb.contains(nval) == false){
cmb.add(nval);
indices.add(pre);
}
} else{
for(int i = 0; i < n; i++)
Perm(pre + s.charAt(i), s.substring(0,i) + s.substring(i + 1, n),col,len);
}
}
public static int getVal(String ltr) {
if (ltr.equals("i") || ltr.equals("j"))
return 1;
if (ltr.equals("a") || ltr.equals("b") || ltr.equals("c"))
return 2;
if (ltr.equals("d") || ltr.equals("e") ||ltr.equals("f"))
return 3;
if(ltr.equals("g") || ltr.equals("h"))
return 4;
if (ltr.equals("k") || ltr.equals("l"))
return 5;
if (ltr.equals("m") || ltr.equals("n"))
return 6;
if (ltr.equals("p") || ltr.equals("r") || ltr.equals("s"))
return 7;
if (ltr.equals("t") || ltr.equals("u") || ltr.equals("v"))
return 8;
if (ltr.equals("w") || ltr.equals("x") || ltr.equals("y"))
return 9;
if (ltr.equals("o") || ltr.equals("q") || ltr.equals("z"))
return 0;
return -1;
}
}
PS-私のコードがまだそれほど効率的でない場合は、お詫び申し上げます。私はまだ練習中です:D
-JCreatorのコンソールは、最初に何かを印刷せずに入力を処理するのにかなりバグがあるため、System.Print( "")がいくつかあります。
-私はこの問題について助けを求めません。理由もなくJavaが20行目にハングアップする理由を尋ねます。
よろしくお願いします。