[Luogu ブラシの質問] Blue Bridge Cup トピックのブレークスルー - 深さ優先検索 - dfs (6)

目次

前に書かれています:

トピック: P1683 の紹介 - Luogu | コンピュータ サイエンス教育の新しいエコロジー (luogu.com.cn)

タイトル説明:

入力形式:

出力フォーマット:

入力サンプル:

出力例:

問題解決のアイデア:

コード:

交流 !!!!!!!!!!

最後に書く:


前に書かれています:

どうすればアルゴリズムをうまく学習できますか?

個人的には質問の体系的なブラッシングが特に重要だと思いますが、

そのため、深さ優先探索を上手に学ぶために、暴力的な探索を使ってブルーブリッジカップに対処するために、

さっそくクイズを始めましょう!

タイトル: P1683 はじめに - Luogu | コンピュータ サイエンス教育の新しいエコロジー (luogu.com.cn)

タイトル説明:

入力形式:

最初の行には、パスの幅と長さを表す 2 つの正の整数 W と H が含まれています。

次の H 行は、H × W の文字行列です。各文字はタイルを表します。

その中で、. 安全なレンガは# 安全でないレンガを表し、@ 最初のレンガを表します。

出力フォーマット:

数値を 1 つだけ含む行を出力し、

つまり、最初のブロック (最初のブロックを含む) から安全に歩けるブロックの最大数です。

入力サンプル:

11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........

出力例:

59

問題解決のアイデア:

深さ優先探索を使うと、

最初の注意点は、検索の順序です。

確認したいので、

すべてのケースをトラバースできる再帰構造を作成しました

(上記の再帰的検索の基本的な考え方に慣れておくことは常に良いことです)

次は具体的なアイデア です

この質問の考え方は次のとおりです。

1.まずすべての位置をトラバースして開始点を見つけ、

2.次にその点@を起点として、上下左右の4方向にサーチし、

3. 検索回数を一度記録し、検索位置をマークして重複検索を防止します。

検索を続ける:

4. すべての場所を検索した後、レコードの数を返すだけです。

次に、コードの実装を次に示します。

コード:

//包常用头文件
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int n, m;

const int N = 30;

//用一个二维数组接收地图
char g[N][N];

//计数
int res = 0;

//记录偏移量
int q[] = {1, 0, -1, 0};
int w[] = {0, 1, 0, -1};

void dfs(int x, int y)
{
    //四个方位搜索
    for(int i = 0; i < 4; i++)
    {
        int a = x + q[i];
        int b = y + w[i];
        
        //如果到边界了,就不搜索
        if(a < 0 || b < 0 || a >= n || b >= m) continue;
        
        //如果不是'.'就不搜索
        if(g[a][b] != '.') continue;
        
        //搜索完就标记
        g[a][b] = '#';
        res++;
        dfs(a, b);
    }
}

int main()
{
    scanf("%d %d", &m, &n);
    
    //接收地图
    for(int i = 0; i < n; i++)
    {
        scanf("%s", g[i]);
    }
    
    //遍历地图,找到@
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            if(g[i][j] == '@')
            {
                //@作为第一个位置,res++
                res++;
                dfs(i, j);
                break;//只有一个起始位置,找到就直接出来
            }
        }
    }
    printf("%d", res);
    return 0;
}

交流 !!!!!!!!!!

最後に書く:

以上がこの記事の内容です、お読みいただきありがとうございます。

この記事が気に入ったら、いいねとコメントをお願いします。また、ご意見をお書きください。

私と一緒にプログラミングを学びたい場合は、私に従ってください。私たちは一緒に学び、成長します。

今後もより質の高いコンテンツを出力していきますので、よろしくお願いします。

おすすめ

転載: blog.csdn.net/Locky136/article/details/129581604