EX19 - 2.04 Editorial /

Time Limit: 2 sec / Memory Limit: 256 MB

説明ページに戻る

問題文

小学校の先生であるあなたはA君に九九の表を埋める宿題を出しました。 次の日、A君は宿題をやってきましたが、いくつかのマスは間違っているようです。

A君の宿題を採点するプログラムを作成してください。

具体的には、以下の要件を満たすプログラムを作成してください。

  • A君の回答の表(9×9の二次元配列)を入力として受け取る
  • 誤った値が書き込まれたマスを正しい値に書き直す
  • 正しい値が書き込まれたマスの個数を数える
  • 誤った値が書き込まれたマスの個数を数える

※参照渡しの練習問題なので、「プログラムの雛形」を書き換える形でプログラムを作成してください。


プログラムの雛形

以下のプログラム中のコメントに従って書き換えるようにしてください。

#include <bits/stdc++.h>
using namespace std;

// 参照渡しを用いて、呼び出し側の変数の値を変更する
void saiten(/* 呼び出し側に対応するように引数を書く */) {
  // 呼び出し側のAの各マスを正しい値に修正する
  // Aのうち、正しい値の書かれたマスの個数を correct_count に入れる
  // Aのうち、誤った値の書かれたマスの個数を wrong_count に入れる

  // ここにプログラムを追記
}


// -------------------
// ここから先は変更しない
// -------------------
int main() {
  // A君の回答を受け取る
  vector<vector<int>> A(9, vector<int>(9));
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      cin >> A.at(i).at(j);
    }
  }

  int correct_count = 0; // ここに正しい値のマスの個数を入れる
  int wrong_count = 0;   // ここに誤った値のマスの個数を入れる

  // A, correct_count, wrong_countを参照渡し
  saiten(A, correct_count, wrong_count);

  // 正しく修正した表を出力
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      cout << A.at(i).at(j);
      if (j < 8) cout << " ";
      else cout << endl;
    }
  }
  // 正しいマスの個数を出力
  cout << correct_count << endl;
  // 誤っているマスの個数を出力
  cout << wrong_count << endl;
}

制約

  • 0 \leq A_{i,j} \leq 100

入力

入力は次の形式で標準入力から与えられます。

A_{1, 1} A_{1, 2} A_{1, 3} A_{1, 4} A_{1, 5} A_{1, 6} A_{1, 7} A_{1, 8} A_{1, 9}
A_{2, 1} A_{2, 2} A_{2, 3} A_{2, 4} A_{2, 5} A_{2, 6} A_{2, 7} A_{2, 8} A_{2, 9}
A_{3, 1} A_{3, 2} A_{3, 3} A_{3, 4} A_{3, 5} A_{3, 6} A_{3, 7} A_{3, 8} A_{3, 9}
A_{4, 1} A_{4, 2} A_{4, 3} A_{4, 4} A_{4, 5} A_{4, 6} A_{4, 7} A_{4, 8} A_{4, 9}
A_{5, 1} A_{5, 2} A_{5, 3} A_{5, 4} A_{5, 5} A_{5, 6} A_{5, 7} A_{5, 8} A_{5, 9}
A_{6, 1} A_{6, 2} A_{6, 3} A_{6, 4} A_{6, 5} A_{6, 6} A_{6, 7} A_{6, 8} A_{6, 9}
A_{7, 1} A_{7, 2} A_{7, 3} A_{7, 4} A_{7, 5} A_{7, 6} A_{7, 7} A_{7, 8} A_{7, 9}
A_{8, 1} A_{8, 2} A_{8, 3} A_{8, 4} A_{8, 5} A_{8, 6} A_{8, 7} A_{8, 8} A_{8, 9}
A_{9, 1} A_{9, 2} A_{9, 3} A_{9, 4} A_{9, 5} A_{9, 6} A_{9, 7} A_{9, 8} A_{9, 9}

A_{i, j}i \times jの答えとしてA君が書き込んだ値です。

出力

A'_{1, 1} A'_{1, 2} A'_{1, 3} A'_{1, 4} A'_{1, 5} A'_{1, 6} A'_{1, 7} A'_{1, 8} A'_{1, 9}
A'_{2, 1} A'_{2, 2} A'_{2, 3} A'_{2, 4} A'_{2, 5} A'_{2, 6} A'_{2, 7} A'_{2, 8} A'_{2, 9}
A'_{3, 1} A'_{3, 2} A'_{3, 3} A'_{3, 4} A'_{3, 5} A'_{3, 6} A'_{3, 7} A'_{3, 8} A'_{3, 9}
A'_{4, 1} A'_{4, 2} A'_{4, 3} A'_{4, 4} A'_{4, 5} A'_{4, 6} A'_{4, 7} A'_{4, 8} A'_{4, 9}
A'_{5, 1} A'_{5, 2} A'_{5, 3} A'_{5, 4} A'_{5, 5} A'_{5, 6} A'_{5, 7} A'_{5, 8} A'_{5, 9}
A'_{6, 1} A'_{6, 2} A'_{6, 3} A'_{6, 4} A'_{6, 5} A'_{6, 6} A'_{6, 7} A'_{6, 8} A'_{6, 9}
A'_{7, 1} A'_{7, 2} A'_{7, 3} A'_{7, 4} A'_{7, 5} A'_{7, 6} A'_{7, 7} A'_{7, 8} A'_{7, 9}
A'_{8, 1} A'_{8, 2} A'_{8, 3} A'_{8, 4} A'_{8, 5} A'_{8, 6} A'_{8, 7} A'_{8, 8} A'_{8, 9}
A'_{9, 1} A'_{9, 2} A'_{9, 3} A'_{9, 4} A'_{9, 5} A'_{9, 6} A'_{9, 7} A'_{9, 8} A'_{9, 9}
correct\_count
wrong\_count

A'は入力のAの各マスを正しい値に修正したものです。
correct\_countは正しい値が書き込まれていたマスの個数、wrong\_countは誤った値が書き込まれていたマスの個数です。

なお、A'の出力について、各行の末尾に空白を入れないことに注意してください。
プログラムの雛形の出力部分を変更しなければ問題ありません。


ジャッジでは以下の入力例以外のケースに関してもテストされることに注意。

入力例1

1 2 3 4 5 6 7 8 9
2 4 100 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

出力例1

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
80
1

A君はA_{2, 3} = 100と書き込みましたが、2 \times 3 = 6なので正しくはA_{2,3} = 6です。
それ以外のマスは正しいので、correct\_count = 80, wrong\_count = 1となります。

入力例2

1 2 3 4 5 6 7 8 9
2 4 6 8 10 37 14 79 18
3 6 9 12 15 18 21 24 39
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 41
6 67 18 24 50 36 42 10 9
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 14
9 18 27 36 45 54 63 72 81

出力例2

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
72
9

ヒント

クリックでヒントを開く 関数の内部から呼び出した側の変数を変更するには、引数を参照にします。

関数の引数を参照にする例を次に示します。

#include <bits/stdc++.h>
using namespace std;

void f(int &i, string &s) {
  i = 123;
  s = "hello";
}
int main() {
  int x;
  string y;
  f(x, y);  // x = 123, y = "hello"となる
  cout << x << endl;  // "123"
  cout << y << endl;  // "hello"
}


テスト入出力

書いたプログラムがACにならず、原因がどうしてもわからないときだけ見てください。

クリックでテスト入出力を見る

テスト入力1
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
テスト出力1
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
81
0

テスト入力2
1 2 3 4 5 6 7 8 9
2 4 29 8 10 12 14 16 18
3 24 9 12 15 18 21 96 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
83 16 24 32 40 48 12 15 72
9 18 27 36 45 54 63 72 81
テスト出力2
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
75
6

テスト入力3
1 31 3 4 5 6 7 8 9
2 4 27 8 10 62 14 16 18
83 6 1 27 33 18 91 24 27
4 8 38 16 20 38 31 32 36
5 10 15 35 25 30 35 56 45
6 60 49 67 11 36 6 48 54
7 14 21 28 35 63 49 16 63
8 10 24 90 40 48 70 40 20
34 91 27 36 45 54 63 52 81
テスト出力3
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
53
28


解答例

必ず自分で問題に挑戦してみてから見てください。

クリックで解答例を見る

#include <bits/stdc++.h>
using namespace std;

// 参照渡しを用いて、呼び出し側の変数の値を変更する
void saiten(vector<vector<int>> &A, int &correct_count, int &wrong_count) {
  // 呼び出し側のAの各マスを正しい値に修正する
  // Aのうち、正しい値の書かれたマスの個数を correct_count に入れる
  // Aのうち、誤った値の書かれたマスの個数を wrong_count に入れる

  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      if (A.at(i).at(j) != (i + 1) * (j + 1)) {
        // 誤った値が書き込まれている場合
        A.at(i).at(j) = (i + 1) * (j + 1);  // 正しい値に修正
        wrong_count++;  // 誤っているマスの個数を +1
      }
      else {
        // 正しい値が書き込まれている場合
        correct_count++;  // 正しいマスの個数を +1
      }
    }
  }
}


// -------------------
// ここから先は変更しない
// -------------------
int main() {
  // A君の回答を受け取る
  vector<vector<int>> A(9, vector<int>(9));
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      cin >> A.at(i).at(j);
    }
  }

  int correct_count = 0; // ここに正しい値のマスの個数を入れる
  int wrong_count = 0;   // ここに誤った値のマスの個数を入れる

  // A, correct_count, wrong_countを参照渡し
  saiten(A, correct_count, wrong_count);

  // 正しく修正した表を出力
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      cout << A.at(i).at(j);
      if (j < 8) cout << " ";
      else cout << endl;
    }
  }
  // 正しいマスの個数を出力
  cout << correct_count << endl;
  // 誤っているマスの個数を出力
  cout << wrong_count << endl;
}