10067: Playing with wheels : Runtime Error!
Posted: Thu Jan 26, 2012 6:36 pm
While submitting the following code, I am getting run time error!!
.. Please Help.

Code: Select all
import java.util.*;
import java.io.*;
public class Wheels {
public static void main(String[] args) throws IOException{
BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
int test = Integer.parseInt(inp.readLine());
while(test>0){
String start = inp.readLine();
StringTokenizer sm = new StringTokenizer(start," ");
String temp = new String("");
while(sm.hasMoreTokens()){
temp = temp+sm.nextToken();
}
int st = Integer.parseInt(temp);
String end = inp.readLine();
StringTokenizer sm2 = new StringTokenizer(end," ");
String temp2 = new String("");
while(sm2.hasMoreTokens()){
temp2 = temp2 + sm2.nextToken();
}
int en = Integer.parseInt(temp2);
int f = Integer.parseInt(inp.readLine());
int forbid[] = new int[f];
int i =0;
while(i<f){
String temp3 = new String("");
StringTokenizer z = new StringTokenizer(inp.readLine()," ");
while(z.hasMoreTokens()){
temp3 = temp3+z.nextToken();
}
forbid[i] = Integer.parseInt(temp3);
i++;
}
System.out.println(compute(st,en,forbid));
if(test!=1){
String s = inp.readLine();
}
test--;
}
}
public static int compute(int st, int end, int[] forbid){
if(st==end) return 0;
LinkedList<Integer> q = new LinkedList<Integer>();
q.offer(st);
HashMap<Integer,Boolean> discovered = new HashMap<Integer,Boolean>();
discovered.put(st,true);
HashMap<Integer,Integer> cost = new HashMap<Integer,Integer>();
cost.put(st,0);
while(!q.isEmpty()){
int current = q.poll();
int k = 0;
int[] child = construct(current);
while(k<8){
if(child[k]==end)return cost.get(current)+1;
if(!search(forbid,child[k])){
if(!discovered.containsKey(child[k])){
discovered.put(child[k],true);
q.offer(child[k]);
cost.put(child[k],cost.get(current)+1);
}
}
k++;
}
}
return -1;
}
public static boolean search(int[] forbid,int val){
for(int i =0;i<forbid.length;i++){
if(forbid[i]==val) return true;
}
return false;
}
public static int[] construct(int current){
int res[] = new int[8];
int digs[] = new int[4];
digs[3] = current%10;
int temp = (current%100);
digs[2] = temp/10;
digs[1] = (current%1000)/100;
digs[0] = (current%10000)/1000;
if(digs[0]==9) {
res[0] = digs[1]*100 + digs[2]*10 + digs[3];
}
else{
res[0] = (digs[0]+1)*1000 + digs[1]*100 + digs[2]*10 + digs[3];
}
if(digs[1]==9) {
res[1] = digs[0]*1000 + digs[2]*10 + digs[3];
}
else{
res[1] = (digs[1]+1)*100 + digs[0]*1000 + digs[2]*10 + digs[3];
}
if(digs[2]==9) {
res[2] = digs[0]*1000 + digs[1]*100 + digs[2]*0 + digs[3];
}
else{
res[2] = digs[0]*1000 + digs[1]*100 + (digs[2]+1)*10 + digs[3];
}
if(digs[3]==9) {
res[3] = digs[0]*1000 + digs[1]*100 + digs[2]*10 + digs[3]*0;
}
else{
res[3] = (digs[0])*1000 + digs[1]*100 + digs[2]*10 + digs[3]+1;
}
if(digs[0]==0) {
res[4] = 9000 + digs[1]*100 + digs[2]*10 + digs[3];
}
else{
res[4] = (digs[0]-1)*1000 + digs[1]*100 + digs[2]*10 + digs[3];
}
if(digs[1]==0) {
res[5] = digs[0]*1000 + digs[2]*10 + digs[3]+900;
}
else{
res[5] = (digs[1]-1)*100 + digs[0]*1000 + digs[2]*10 + digs[3];
}
if(digs[2]==0) {
res[6] = 90+digs[0]*1000 + digs[1]*100 + digs[2]*0 + digs[3];
}
else{
res[6] = digs[0]*1000 + digs[1]*100 + (digs[2]-1)*10 + digs[3];
}
if(digs[3]==0) {
res[7] = 9+digs[0]*1000 + digs[1]*100 + digs[2]*10 + digs[3]*0;
}
else{
res[7] = (digs[0])*1000 + digs[1]*100 + digs[2]*10 + digs[3]-1;
}
return res;
}
}