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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Q&A

解決済

1回答

949閲覧

範囲for文(for( : ))の動作について

Magolors

総合スコア21

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

0グッド

1クリップ

投稿2020/02/22 06:01

編集2020/02/22 08:13

前提・実現したいこと

C++でbit全探索を用いる問題をといているのですが、正解できません。解答例をみると、範囲for文が使われており、そこが誤答の原因だと考えたのですが、解答例で使われているfor文の動作と自分の回答したfor文の動作がどう異なるかわからず、どう直せば良いのかわかりません。どなたか教えていただきたいです。

発生している問題・エラーメッセージ

以下の二つです。

Wrong Answer Runtime Error

該当のソースコード

自分で書いたもの(REPはfor文を短縮するためのものです)

C++

1#include <bits/stdc++.h> 2#define REP(i, n) for(int i = 0; i < n; i++) 3#define REPR(i, n) for(int i = n; i >= 0; i--) 4#define FOR(i, m, n) for(int i = m; i < n; i++) 5#define INF 2e9 6#define MOD 1e9+7; 7#define ALL(v) v.begin(), v.end() 8using namespace std; 9typedef long long LL; 10typedef vector<int> VI; 11typedef vector<vector<int> > VVI; 12typedef vector<string> VS; 13 14int main(){ 15 int N, M; 16 cin >> N >> M; 17 VI k(M); 18 VVI s(M); 19 REP(i,N){ 20 int ktemp; 21 cin >> ktemp; 22 VI stemp(ktemp); 23 REP(j,ktemp){ 24 cin >> stemp[j]; 25 stemp[j]--; 26 } 27 s.push_back(stemp); 28 } 29 VI p(M); 30 REP(i,M){ 31 cin >> p[i]; 32 } 33 int temp, chk, cnt = 0; 34 REP(bit, (1<<N)){ 35 chk = 1; 36 REP(i, M){ 37 temp = 0; 38 REP(j, k[i]) if ((bit>>s[i][j]) & 1) temp++; 39 if (temp % 2 != p[i]){ 40 chk = 0; 41 break; 42 } 43 } 44 if (chk) cnt++; 45 } 46 cout << cnt << endl; 47}

解答例

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int N, M; cin >> N >> M; 6 7 vector<vector<int>> vec(M); 8 9 for (int i = 0; i < M; ++i) { 10 int k; cin >> k; 11 vec[i].resize(k); 12 for (int j = 0; j < k; ++j) { 13 cin >> vec[i][j]; 14 --vec[i][j]; 15 } 16 } 17 18 vector<int> p(M); 19 for (int i = 0; i < M; ++i) cin >> p[i]; 20 21 int ans = 0; 22 for (int i = 0; i < (1 << N); ++i) { 23 bool ok = true; 24 for (int j = 0; j < M; ++j) { 25 int c = 0; 26 for (int id : vec[j]) { 27 if ((i >> id) & 1) { 28 ++c; 29 } 30 } 31 c %= 2; 32 if (c != p[j]) { 33 ok = false; 34 } 35 } 36 if (ok) { 37 ++ans; 38 } 39 } 40 41 cout << ans << endl; 42 43 return 0; 44} 45

試したこと

コードの比較をしましたがわかりませんでした。

補足情報(FW/ツールのバージョンなど)

C++11(GCC)以降を使用しています。

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

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

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

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

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

BeatStar

2020/02/22 06:29

今私は頭が回っていない状態なので読んでいませんが、 拡張forと通常のforは大差ないですよ。(ただし配列なんかをすべて処理する場合) 多分、正解しないのは、別のところにありそうです。 例えば x≧10 としないといけないところを x>10としているとか。
Magolors

2020/02/22 06:38

回答ありがとうございます。初歩的な質問で申し訳ありません。範囲を見直すなど再度したいと思います。
jimbe

2020/02/22 08:09

C++ のご質問であれば C のタグは外して頂けませんでしょうか.
Magolors

2020/02/22 08:14

修正しました。Cでもほぼ同様の実装が可能だと勘違いしてつけてしまいました。申し訳ありません。
can110

2020/02/22 08:18

コードの違いはfor文だけという認識でよいでしょうか?(さすがに細かく比較するのは疲れますので)
Magolors

2020/02/22 08:27

原因がfor文ではないと指摘をいただいたので、for文ではないと考えております。申し訳ありません。自分で再考したいと思います。
guest

回答1

0

ベストアンサー

最初のREP(i,N){Mの間違いではないでしょうか?

追記:
kが空のまま使われています。

さらに追記:

s.push_back(stemp);

これはおそらく意図通りには動いていないでしょう。
とりあえず応急処置するならs[i] = stemp;ですかね

入力例のみを確かめただけですが

c++

1int main(){ 2 int N, M; 3 cin >> N >> M; 4 VVI s(M); 5 REP(i,M){ 6 int ktemp; 7 cin >> ktemp; 8 VI stemp(ktemp); 9 REP(j,ktemp){ 10 cin >> stemp[j]; 11 stemp[j]--; 12 } 13 s[i] = stemp; 14 } 15 VI p(M); 16 REP(i,M){ 17 cin >> p[i]; 18 } 19 int cnt = 0; 20 bool chk; 21 REP(bit, (1<<N)){ 22 chk = true; 23 REP(i, M){ 24 int temp = 0; 25 int sz = size(s[i]); 26 REP(j, sz){ 27 if ((bit>>s[i][j]) & 1) temp++; 28 } 29 if (temp % 2 != p[i]){ 30 chk = false; 31 break; 32 } 33 } 34 if (chk) cnt++; 35 } 36 cout << cnt << endl; 37}

投稿2020/02/22 08:41

編集2020/02/22 09:12
asm

総合スコア15149

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

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

Magolors

2020/02/22 09:21

ありがとうございます。初歩的なミスで申し訳ありませんでした。
asm

2020/02/22 09:24

入力例ですら通らない状況ならば、まずはデバッグすることをおすすめします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問