質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1855閲覧

AtCoder(ABC-B)のビンゴかどうか判定する問題

cunwe

総合スコア65

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/18 04:27

https://atcoder.jp/contests/abc157/tasks/abc157_b
こちらの問題の正解コードについて質問がございます。

#include <bits/stdc++.h> using namespace std; int A[3][3]; bool ok[3][3]; int main(){ for (int i=0;i<3;++i){ for (int j=0;j<3;++j){ cin >> A[i][j]; } } int n; cin >> n; for (int i=0;i<n;++i){ int b; cin >> b; for (int j=0;j<3;++j){ for (int k=0;k<3;++k){ if(A[j][k] == b) ok[j][k] = true; } } } //ここまででマルバツの配列に変換できた bool bingo = false; for (int i=0;i<3;++i){ int cnt = 0; for (int j=0;j<3;++j) if(ok[i][j]) cnt++; if (cnt == 3) bingo = true; } for (int j=0;j<3;++j){ int cnt = 0; for (int i=0;i<3;++i) if(ok[i][j]) cnt++; if (cnt == 3) bingo = true; } //ここまでで縦横 int cnt = 0; for (int i=0;i<3;++i){ if(ok[i][i]) cnt++; if (cnt == 3) bingo = true; } //ここまでで縦横斜め if (ok[0][2] && ok[1][1] && ok[2][0]) bingo = true; if (bingo) cout << "Yes" << endl; else cout << "No" << endl; }

######質問内容
if (ok[0][2] && ok[1][1] && ok[2][0]) bingo = true;が何を表しているのかわかりません。最初のbool ok[3][3]は3×3のfalseで埋められた表で、ok[0][2],ok[1][1],ok[2][0]って左上から斜めのマスを指していると思うのですがそのときしかbingo=trueにならない?となってしまいました。このif文の説明をしていただけましたら幸いです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

おんなじことをfor-loop使って

C++

1 cnt = 0; 2 for (int i=0;i<3;++i){ 3 if(ok[i][2-i]) cnt++; 4 if (cnt == 3) bingo = true; 5 }

って書いてあったらわかるかしら。
右上から左下に向かうナナメbingoかどうか調べてますが。

投稿2020/05/18 05:56

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cunwe

2020/05/18 10:13

ok[i][i]の横に||ok[i][2-i]としたら通りました。これで2つの斜めを試せるのですね、ありがとうございます。
episteme

2020/05/18 11:06

ホント? それだと ××● ×●× ××● のときbingo判定されちゃうんじゃね?
cunwe

2020/05/20 06:26

それは3連チャンのfalseなので該当しないのではないでしょうか...?
episteme

2020/05/20 06:54

(検証してほしいナー...)
cunwe

2020/05/20 12:50

手元で実行してみました。epistemeさんのような例で検証したらbingo判定されてしまいました!なぜこれで通ってしまったのか謎ですね。。どうして||ok[i][2-i]の追記ではダメなんでしょうか...?ちなみに||ok[i][2-i]をやめてepistemeさんの回答にしてもbingo判定されてしまいました。。
episteme

2020/05/20 12:53

だったらどっか間違ってるんでしょう。
guest

0

ベストアンサー

ok[0][2],ok[1][1],ok[2][0]って左上から斜めのマスを指していると思うのですが

右上から斜めのマスかなと思います。
そのif文に到達する前にもbingo=trueにする条件が入っていると思います(コメントの通り動いている)。

このif文の説明をしていただけましたら幸いです。

漏れている条件の補完を行っていますね。

投稿2020/05/18 04:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cunwe

2020/05/18 10:14

「漏れている条件」というのがもう片方の斜めのことですね、理解できましたありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問