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を使っています。
凡ミスである可能性が高いと思うのですが、どうしてもわからず、質問させていただきました。どうぞよろしくお願いいたします。