24394


Aizu online, Introduction to Programming
11-3のサイコロの一致を判定する問題をJavaで解いているのですが、テストケース(6/35)しか通らず、どこが間違っているのかわかりません。  
どなたか間違いが見つかったら教えていただいてもいいでしょうか。

[code]

        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String str;
        String[] dice;
        int[] compare_dice=new int[6];
        int[] int_dice=new int[6];
        int count=0;
    
        try{
    
            str=reader.readLine();
            dice=str.split(" ");
            for(int i=0;i<6;i++){
                int_dice[i]=Integer.parseInt(dice[i]);
            }//1つめのサイコロ
    
            str=reader.readLine();
            dice=str.split(" ");
            for(int i=0;i<6;i++){
                compare_dice[i]=Integer.parseInt(dice[i]);
            }//2つめのサイコロ
    
[/code]

//サイコロの上面、右面を一致させたあと、各面が一致しているかを判定する

[code]

            //上面の一致
            if(int_dice[0]!=compare_dice[0]){
                for(int j=0;j<3;j++){
                 roll('S', int_dice);//南方向にサイコロを3回まで転がす。
    
                 if(int_dice[0]==compare_dice[0])break;
                }
                if(int_dice[0]!=compare_dice[0]){
                    for(int j=0;j<3;j++){
                        roll('E', int_dice);//東方向にサイコロを3回まで転がす。
                        if(int_dice[0]==compare_dice[0])break;
                    }
                }
            }//上面一致
    
[/code]

//次に全面を一致させる。

[code]

            if(int_dice[1]!=compare_dice[1]){
                for(int k=0;k<3;k++){
                    rotate(int_dice);//サイコロの横回転
                    if(int_dice[1]==compare_dice[1])break;
                }
            }//前面一致
    
[/code]

//各面が一致しているかを判定する。

[code]

            for(int i=0;i<6;i++){
                if(int_dice[i]==compare_dice[i]){
                    count++;
                }
                System.out.println(int_dice[i]+" "+compare_dice[i]);//確認用
            }
    
            if(count==6){System.out.println("Yes");}else{
                System.out.println("No");
            }
        }catch(IOException e){
            System.out.print(e);
        }
    }
    
[/code]

//以下メソッド  
//11-1, 11-2でも同じメソッドを使ったので長いです。

[code]

    private static void rotate(int[] int_dice){
        //横に右回転するためのメソッド
        int x=int_dice[3];
        int_dice[3]=int_dice[4];
        int_dice[4]=int_dice[2];
        int_dice[2]=int_dice[1];
        int_dice[1]=x;
    }
    
    private static void roll(char ch, int[] int_dice){
        int[] dice_for_change=new int[6];
    
        switch(ch){
    
        case 'S':
        {
            dice_for_change[0]=int_dice[4];
            dice_for_change[1]=int_dice[0];
            dice_for_change[2]=int_dice[2];
            dice_for_change[3]=int_dice[3];
            dice_for_change[4]=int_dice[5];
            dice_for_change[5]=int_dice[1];
    
            }
        break;
    
        case 'E':
        {
            dice_for_change[0]=int_dice[3];
            dice_for_change[1]=int_dice[1];
            dice_for_change[2]=int_dice[0];
            dice_for_change[3]=int_dice[5];
            dice_for_change[4]=int_dice[4];
            dice_for_change[5]=int_dice[2];
    
            }
        break;
    
        case 'N':
        {//処理
            dice_for_change[0]=int_dice[1];
            dice_for_change[1]=int_dice[5];
            dice_for_change[2]=int_dice[2];
            dice_for_change[3]=int_dice[3];
            dice_for_change[4]=int_dice[0];
            dice_for_change[5]=int_dice[4];
            }
        break;
    
        case 'W':
        {
            dice_for_change[0]=int_dice[2];
            dice_for_change[1]=int_dice[1];
            dice_for_change[2]=int_dice[5];
            dice_for_change[3]=int_dice[0];
            dice_for_change[4]=int_dice[4];
            dice_for_change[5]=int_dice[3];
            }
        break;
        }//switch
        for(int k=0;k<6;k++){
            int_dice[k]=dice_for_change[k];
    
        }//転がすたびに代入
    
[/code]


CC BY-SA 3.0
2016-04-27T10:11:47.307
24383
2016-04-27T17:21:02.503
15279
question
java
Aizu Onlineジャッジ　二つのサイコロの一致


シリーズになっている問題のようですね。  
[最初の問題](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_11_A)で「サイコロをクラスや構造体で作成しておきましょう」とあります。  
クラス化して順番に機能を追加していく事で、自然とオブジェクト指向になじめるように作成された問題だと感じました。  
これを無視すると、この問題を解く意味が無いと思います。

### 質問のコード

コメントから判断するに、

  * 上面を一致させる
  * 上面を固定したまま回転させ、前面を一致させる
  * その状態でダイスの各面を比較し判定する

という流れのようです。  
これでは、「上面と前面が一致する状態が複数ある」ダイスで誤判定が出る可能性があります。  
通常のダイスは全ての面が違う数字なので、これは無いです。  
しかし、この問題では同じ数字が何面にも存在し得ます。

### エラー

失敗したテストケースですが、

[code]

    1 1 1 1 1 6
    1 6 1 1 1 1
    
[/code]

このように、1 が多いです。  
ここで例えば（これは例えばです。質問のコードは追っていません。）、2個目のダイス（2行目）を'N', 'W'と動かせば

[code]

    1 1 1 6 1 1
    
[/code]

となり、上面と前面（1桁と2桁目）が1個目のダイスと一致します。  
しかし、他の面は一致しません。  
質問のコードでは、ここであきらめて`"No"`を出力している気がします。  
これは、あと一回`W`に転がすと1個目のダイスと一致します。  
正解は`"Yes"`です。

### どうすればよいか

総当たりでよいと思います。


CC BY-SA 3.0
2016-04-27T17:21:02.503
24394
2016-04-27T17:21:02.503
3054
24383
answer