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

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

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

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

Q&A

1回答

273閲覧

C++で競技プログラミング DFS 論理エラーの特定について

hon.ki

総合スコア157

C++

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

0グッド

0クリップ

投稿2019/02/10 12:43

編集2019/02/10 13:07

http://poj.org/problem?id=2386の問題を、蟻本のp36をみながら解いておりましたところ、次のような論理エラーが起こりました。
input:
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
期待するoutput
3
実際のoutput
(出力なし)

#include <iostream> using namespace std; const int MAX_N = 100; const int MAX_M = 100; int N, M; char field[MAX_N][MAX_M + 1]; //庭 //現在位置(x,y) void dfs(int x, int y) { //今いるところを、.に置き換える field[x][y] = '.'; //移動する8方向について,ループする for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { //x方向にdx, y方向にdy 移動した場所を(nx,ny)とする int nx = x + dx, ny = y + dy; //nxとnyが水たまりかどうか、またfield[nx][ny]が水たまりかどうかを特定する if (0 <= nx && nx < N && 0 <= nx && ny < M && field[nx][ny] == 'W') dfs(nx, ny); } } return; } void solve() { int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (field[i][j] == 'W') { //Wが残っているなら、そこからdfsを始める dfs(i, j); res++; //cout << res << endl; } } } //cout << res << endl; } int main() { cin >> N >> M; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> field[i][j]; } } return 0; solve(); }

<試してみたこと>
入力の受け取りの後(57行目)に、

for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cout << field[i][j]<<endl; } }

としたところ、
W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.
という出力がありました。このことから、入出力に問題はない考えました。
solve関数の中に問題があるのではと考え、コメントアウトした2箇所で変数resを出力してみましたが、いずれも出力は何もされませんでした。といって、条件式を確認しましたが、間違っているところはわかりませんでした。

なお、ローカル環境とは、mac OS High Sierra10.13.6
コンパイラは
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
になります。デフォルトのC++14で、コンパイルしました。
VSCodeを使っています。

凡ミスである可能性が高いと思うのですが、どうしてもわからず、質問させていただきました。どうぞよろしくお願いいたします。

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

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

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

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

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

aikon_marimo

2019/02/10 12:55

とりあえず、main関数内でsolve()の前にreturnしているのを直して試してみてください。
hon.ki

2019/02/10 12:59

aikon_marimoさん、たしかにそこは、おかしいですね。直して試してみたところ、まだoutputは何もなし、となっております。回答ありがとうございます。
guest

回答1

0

少なくとも例題にあった入力例では、3と表示されましたよ。

cpp

1#include <iostream> 2using namespace std; 3const int MAX_N = 100; 4const int MAX_M = 100; 5//int N, M; 6//char field[MAX_N][MAX_M + 1]; //庭 7 8static const int N = 10, M = 12; 9char field[N][M] = { 10 {'W', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'}, 11 {'.', 'W', 'W', 'W', '.', '.', '.', '.', '.', 'W', 'W', 'W'}, 12 {'.', '.', '.', '.', 'W', 'W', '.', '.', '.', 'W', 'W', '.'}, 13 {'.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'}, 14 {'.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', '.', '.'}, 15 {'.', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.', '.'}, 16 {'.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', 'W', '.'}, 17 {'W', '.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', '.'}, 18 {'.', 'W', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.'}, 19 {'.', '.', 'W', '.', '.', '.', '.', '.', '.', '.', 'W', '.'}, 20}; 21 22//現在位置(x,y) 23void dfs(int x, int y) 24{ 25 //今いるところを、.に置き換える 26 field[x][y] = '.'; 27 28 //移動する8方向について,ループする 29 for (int dx = -1; dx <= 1; dx++) { 30 for (int dy = -1; dy <= 1; dy++) { 31 // x方向にdx, y方向にdy 移動した場所を(nx,ny)とする 32 int nx = x + dx, ny = y + dy; 33 34 // nxとnyが水たまりかどうか、またfield[nx][ny]が水たまりかどうかを特定する 35 if (0 <= nx && nx < N && 0 <= nx && ny < M && field[nx][ny] == 'W') 36 dfs(nx, ny); 37 } 38 } 39 return; 40} 41void solve() 42{ 43 int res = 0; 44 for (int i = 0; i < N; i++) { 45 for (int j = 0; j < M; j++) { 46 if (field[i][j] == 'W') { 47 // Wが残っているなら、そこからdfsを始める 48 dfs(i, j); 49 res++; 50 } 51 } 52 } 53 std::cout << res << std::endl; 54} 55int main() 56{ 57 // cin >> N >> M; 58 // for (int i = 0; i < N; i++) { 59 // for (int j = 0; j < M; j++) { 60 // cin >> field[i][j]; 61 // } 62 // } 63 solve(); 64} 65

投稿2019/02/10 14:25

編集2019/02/10 14:26
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問