BFSの初心者

BFS:

:**初期知っていると双方向BFSと、状態をターゲット
BFSの最高のビューを使用する権利
**チームとして繰り返さないでください

実装フレームワーク:

コピーされた(ソース:https://www.luogu.org/blog/stephen2333/solution-p1135
PS:私もスタートを書きましたが、本当に彼は良い書き込みだと思います

  1. 訪問としてチームに初期状態の場合は、初期状態を設定
  2. キューが空でない場合は、チームのヘッド素子、そうでない場合は、手順5に進んでください
  3. それがあれば溶液の最終要素のチームは、その後、ステップ5に進んでくださいことを確認してください。
  4. チームの要素については、有効な場合、すべての隣接状態を確認し、アクセスできなくなり、その後、
    その後、使用可能なすべての隣接状態のチームに、そして訪れたとして、これらの状態を設定します
  5. それは、出力、または全く解決策の説明であれば、最後の要素の検査チームは究極のソリューションです。2.繰り返しに進み

典型的には、キュー(先入れ先出し、FIFO)を用いて実施

初始化队列q;
q = {起点u};标记s为已访问;
while(q为非空){
    去q队首元素 now;now出队;
    If(now == 目标状态) {….}
    所有与now 相连 并 且未被访问的点进入队列(没被标记);
    并标记now已访问;
}

長方形の検索幅:

説明タイトル
9~9に0からなる数字の長方形アレイ、数字1は、セルを表す矩形アレイで必要な細胞の数、所与の同一の細胞または細胞数と比較した場合、細胞は約上下のセル番号に沿って定義されています。?(1 <= M、N <= 100)
の入力及び出力フォーマット
入力フォーマット:

入力:整数m、n個(m行、n列)
のマトリクス
出力フォーマット:

出力:細胞の数
/
4 10
0 5 0 4 0 2 0 3 6 7
。1 0 5 4 3 5 0 0 6 0
2 4 5 6 0 0 0 6 7 1
0 0 0 0 0 0 0 0 8 9
/

#include<cstdio>
#define maxn 100

int m,n,cnt = 0;
char s[maxn];
int a[maxn][maxn],vis[maxn][maxn];

int q[maxn];
int movex[5] = {0,1,-1,0,0};
int movey[5] = {0,0,0,1,-1};

void bfs(int x, int y) {
    int l = 0, r = 0;
    q[r++] = x;
    q[r++] = y;//按顺序加入  取出时就是按的这个顺序取出
    while(l < r) {//当 l = r时 队列为空  就找完第53行传入的点附近的数(可以和它构成cells的) 
        int nowx = q[l++];
        int nowy = q[l++];//取出当前点的位置
        for(int i = 1; i <= 4; i++) {//判断四个方向(上下左右)的数  
            int ix = nowx + movex[i];//当前(四个之一)方向上的坐标
            int iy = nowy + movey[i];
            if(ix < 1 || iy < 1 || ix > n || iy > m) continue;//一定要写!!!矩阵的bfs的边界 
            //if(ix == 0 || iy == 0 || ix || ix > n || iy > m)  continue;//最好写上面的 
            if(a[ix][iy]) {
                if(!vis[ix][iy]) {//再次判断它用不用被选 选过之后就没必要选了 
                    vis[ix][iy] = 1;
                    q[r++] = ix;
                    q[r++] = iy;//入队 
                } 
            }
        }
    }
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++) {
        scanf("%s",s);//先输入一行较长的字符数组,因为原题的没有空格 
        for(int j = 1; j <= m; j++) {
            a[i][j] = s[j - 1] - '0';//s[j - 1]是s的第一个元素 
        }
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(!vis[i][j]) {//找出没有走过的点
                vis[i][j] = 1;//做标记
                if(a[i][j]) { //这才是找到可以宽搜的 点
                    bfs(i,j);
                    cnt++;
                }
            }
        }
    }
    printf("%d",cnt);
}

DFS;

組み合わせを押収する場合通常、最適な解決策は、我々は、DFSの使用を検討してください

データ構造:システムスタック。

おすすめ

転載: www.cnblogs.com/virtualtan/p/10972470.html