Atcoder問題でWAが出る原因と解決方法:コードの改善点

C言語関連

Atcoderの問題でWA(Wrong Answer)が出た場合、どの部分でエラーが起きているのかを特定するのは初心者にとって難しいかもしれません。この投稿では、質問者が提供したコードの問題点を指摘し、どのように改善すべきかを説明します。

1. 問題の概要

質問者は、Atcoderの問題「dfs_a」でWAが発生し、特定のファイル(03_rndhardsmall_04.txt、03_rndhardsmall_08.txt)でエラーが出ているとのことです。提供されたコードを使って、この問題の原因を探ります。

2. コードの問題点

提供されたコードを見てみると、いくつかの改善が必要です。

  • 2.1 不必要な条件チェック: コードの中で、`if(i==sx&&j==sy)`の部分で何も実行していません。この部分は削除するか、処理を追加する必要があります。
  • 2.2 `flag`の使い方: `flag`の変数が多く使われていますが、その役割が明確ではありません。`flag`を整理し、論理フローを見直す必要があります。
  • 2.3 不必要な`while`ループ: `while`ループ内で再びキューにアイテムを追加する部分がありますが、これは無限ループを引き起こす可能性があります。

3. 解決方法と改善案

上記の問題を解決するためには、以下の改善を行います。

  • 3.1 初期化の改善: `flag`や`pass`配列の初期化を適切に行うことで、ロジックの誤動作を防ぎます。
  • 3.2 キュー操作の見直し: 再度キューにアイテムを追加する操作を削除し、`while`ループを簡潔にすることで、無駄な繰り返しを排除します。
  • 3.3 終了条件の明確化: `flagtt`を使って終了条件を明確にし、ループを整理します。

4. コードの改善例

改善したコードは以下の通りです。

#include 
using namespace std;

int main() {
    int xx[] = { 1, 0, -1, 0};
    int yy[] = { 0, 1, 0, -1};
    int H, W;
    cin >> H >> W;

    vector> town(H, vector(W));
    int sx, sy, gx, gy;
    for (int i = 0; i < H; i++)
        for (int j = 0; j < W; j++)
            cin >> town[i][j];

    vector> pass(H, vector(W));
    queue> que;
    que.push({ sx, sy });

    while (!que.empty()) {
        int x = que.front().first;
        int y = que.front().second;
        que.pop();
        for (int d = 0; d < 4; d++) {
            int nx = x + xx[d], ny = y + yy[d];
            if (0 <= nx && nx < H && 0 <= ny && ny < W && (town[nx][ny] == '.' || town[nx][ny] == 'g') && !pass[nx][ny]) {
                pass[nx][ny] = true;
                que.push({ nx, ny });
                if (nx == gx && ny == gy) {
                    cout << "Yes" << endl;
                    return 0;
                }
            }
        }
    }
    cout << "No" << endl;
    return 0;
}

5. まとめ

Atcoderの問題でWAが発生した場合、コードのロジックを整理し、無駄な処理を排除することが重要です。特に、キュー操作やフラグの使い方を見直すことで、効率的な解法に改善できます。

コメント

タイトルとURLをコピーしました