前提・実現したいこと
AIZU ONLINE JUDGEの「IPT1_11_C サイコロIII」の問題で、同一のサイコロを判定する処理をどのように書けばいいかわかりません。
2つの同一のサイコロを判定する処理は、以下のソースコードのis_same_dice関数です。
問題文については、お手数をかけしますが、リンク先をご覧ください。
リンク先にありますSample Input1と2は期待通りの出力が得られます。
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/11/ITP1_11_C
どうぞよろしくお願いいたします。
発生している問題・エラーメッセージ
以下のソースコードを投稿すると、テストケース6でYESの出力が得られません。
テストケース6の入力値
10 20 20 40 50 50 50 10 20 20 40 50
該当のソースコード
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4class Dice { 5 public: 6 Dice(int number[]); 7 void print_status(); 8 int get_status(int number); 9 void toss(char direction); 10 bool is_same_dice(Dice d); 11 12 private: 13 int dice[6]; 14}; 15 16Dice::Dice(int n[]) { 17 for(int i = 0; i < 6; i++) { 18 dice[i] = n[i]; 19 } 20} 21 22void Dice::print_status() { 23 for(int i = 0; i < 6; i++) { 24 cout << dice[i] << " "; 25 } 26 cout << endl; 27} 28 29int Dice::get_status(int number) { return dice[number]; } 30 31void Dice::toss(char direction) { 32 int tmp; 33 switch(direction) { 34 case 'N': 35 tmp = dice[0]; 36 dice[0] = dice[1]; 37 dice[1] = dice[5]; 38 dice[5] = dice[4]; 39 dice[4] = tmp; 40 case 'S': 41 tmp = dice[0]; 42 dice[0] = dice[4]; 43 dice[4] = dice[5]; 44 dice[5] = dice[1]; 45 dice[1] = tmp; 46 case 'E': 47 tmp = dice[0]; 48 dice[0] = dice[3]; 49 dice[3] = dice[5]; 50 dice[5] = dice[2]; 51 dice[2] = tmp; 52 case 'W': 53 tmp = dice[0]; 54 dice[0] = dice[2]; 55 dice[2] = dice[5]; 56 dice[5] = dice[3]; 57 dice[3] = tmp; 58 } 59} 60 61bool Dice::is_same_dice(Dice d) { 62 for(int i = 0; i < 6; i++) { 63 if(i < 4) { 64 toss('S'); 65 } else if(i == 4) { 66 toss('E'); 67 } else { 68 toss('W'); 69 toss('W'); 70 } 71 72 if(get_status(0) == d.get_status(0) && 73 get_status(1) == d.get_status(1) && 74 get_status(2) == d.get_status(2)) { 75 return true; 76 } 77 } 78 return false; 79} 80 81int main() { 82 int dice_table[2][6]; 83 84 for(int i = 0; i < 2; i++) { 85 for(int j = 0; j < 6; j++) { 86 cin >> dice_table[i][j]; 87 } 88 } 89 90 Dice d1(dice_table[0]), d2(dice_table[1]); 91 92 if(d1.is_same_dice(d2)) { 93 cout << "Yes" << endl; 94 } else { 95 cout << "No" << endl; 96 } 97 return 0; 98} 99
追加(2021/06/16)
C++
1bool Dice::is_same(Dice d) { 2 for(int i = 0; i < 6; i++) { 3 if(dice[i] != d.get_status(i)) { 4 return false; 5 } 6 } 7 return true; 8} 9 10bool Dice::is_same_dice(Dice d) { 11 for(int i = 0; i < 6; i++) { 12 if(i < 4) { 13 toss('S'); 14 } else if(i == 4) { 15 toss('E'); 16 } else { 17 toss('W'); 18 toss('W'); 19 } 20 21 for(int j = 0; j < 4; j++) { 22 if (j == 1) { 23 toss('E'); 24 } else if(j < 4) { 25 toss('S'); 26 } 27 if (is_same(d)) { 28 return true; 29 } 30 } 31 // toss('S'); 32 toss('W'); 33 } 34 return false; 35}
テストケース11の入力値
期待通りのYesの出力が得られない。
1 2 3 4 5 6 5 3 6 1 4 2
追加(2021/06/17)
側面のみを回転させる関数right_rotationを書いてみましたが、不合格になってしまっています。
C++
1bool Dice::is_same_dice(Dice d) { 2 for(int i = 0; i < 6; i++) { 3 if(i < 4) { 4 toss('S'); 5 } else if(i == 4) { 6 toss('E'); 7 } else { 8 toss('W'); 9 toss('W'); 10 } 11 12 for(int j = 0; j < 4; j++) { 13 right_rotation(); 14 if(is_same(d)) { 15 return true; 16 } 17 } 18 } 19 return false; 20} 21 22void Dice::right_rotation() { 23 int tmp = dice[1]; 24 dice[1] = dice[2]; 25 dice[2] = dice[4]; 26 dice[4] = dice[3]; 27 dice[3] = tmp; 28}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/15 16:08
2021/06/16 01:06 編集
2021/06/16 11:42
2021/06/17 01:11
2021/06/17 04:12
2021/06/17 04:25
2021/06/17 04:41 編集
2021/06/18 15:23