DFS talk

DFS

Le premier contact doit être d'apprendre un morceau de données traversant l'arbre et d'une profondeur d'abord la recherche et en largeur recherche, mais a récemment découvert ce problème brosse est utilisé si souvent , pour résumer. Les anciennes règles, de se sentir bien sur le blog.
Blog DFS

probablement routine

Besoin d'énumérer des circonstances différentes quand il est approprié d'utiliser DFS, DFS utilise en fait une énumération récursive, vous pouvez également revenir. Notez que lorsque vous utilisez plusieurs endroits
1. les conditions aux limites, qui est, quand pour quitter le récursives
2.DFS de paramètres en général ce qui est utilisé pour apporter des modifications à mettre ce paramètre variable
état 3. mise à jour, quel état serait plus Recherchez
ce modèle essai blog est donné en
Insérer ici l'image Description
général, nous devons définir la marque pour enregistrer ou non recherché, donc il y aura un tableau vis.

Un exemple simple

Prendre toute disposition d'un exemple, entrer un nombre entier, égal à la sortie de nombre entier est inférieur à la totalité de l'agencement
, par exemple, l' entrée 2, sortie: 12; 21

Ceci est la première énumération d'un problème similaire, donc l'utilisation directe de DFS. Selon le nombre de paramètres de la fonction pensée entière d'abord, cette question à une entrée de ce qui précède, il sera entré comme paramètre. Ensuite, l'état de sortie est que le paramètre récursif dépasse l'entrée et la sortie de nombre entier tout ce temps pour sortir de l'arrangement récursive. (Si vous ne comprenez pas l'attente du regard suivant le code pour comprendre), puis mettre à jour la condition est inférieur ou égal aux paramètres entiers et ce nombre n'a pas été recherché, sinon il sera répété.

code

//dfs
#include<iostream>
#include<cmath>
using namespace std;

int n;
bool vis[150]={false};
int res[150]={0};

void dfs(int x){
    if(x==n+1){  //到了最后一个
        for(int i=1;i<=n;i++)
            cout<<res[i]<<" ";
        cout<<endl;
        return ;
    }

    for(int i=1;i<=n;i++){
        if(vis[i]==false){
            res[x]=i;
            vis[i]=true;
            dfs(x+1);
            vis[i]=false;
        }
    }
}

int main(){
    cin>>n;
    dfs(1);
    return 0;
}

Recherche en profondeur depuis le début, chaque recherche sera profonde x ++, donc quand x> pour quitter le récursif n. Rappelez-vous chaque fois que vous devez changer de nouveau après la marque de déplacement change garantie de remboursement.
Insérer ici l'image Description

Un peu plus complexe

Le problème aujourd'hui est juste brosse, utilisé pour partager d'
Insérer ici l'image Description
abord cela en deux parties, les deux parties de la même valeur. Je voudrais voir ce début est gourmand, pour trier puis mettre bien ensemble, puis lentement ajouté à la petite, voir si vous pouvez avoir un temps égal. Mais regardez à la sortie, vous devez inclure un nombre minimal de partitions en treillis le coin supérieur gauche de la sortie, il ne peut pas être gourmand, cette fois -ci est semblable à énumérer, donc je DFS.

Idée
puisque elle est égale en deux parties, à condition que I et comme égale à la moitié de la valeur d'une partie de l'ensemble, lorsque plus de la récursivité de sortie. Compter le plus petit paramètre de maille bien sûr, mais parce que c'est le coin supérieur gauche de la nécessité de la grille d'inclure un tableau à deux dimensions, donc il a besoin des coordonnées x, y et enregistre les valeurs et les paramètres actuels. Mais nous sommes libres de le diviser doit également donner la direction de la recherche, cette expérience peut se rappeler quand, après la rencontre de ce tableau à deux dimensions peuvent effectuer des recherches directement

code

#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;

int n,m;//格子的高,宽,map[n][m]
int map[11][11],vis[11][11],all_sum,res=404;
int dir[4][2]={0,1,0,-1,1,0,-1,0};//搜索的四个方向

void dfs(int x,int y,int sum,int cnt){    //x,y是当前坐标,sum是搜索位置值的和,cnt记录搜索过多少格子,也就是包含左上角的那部分格子数
    if(sum>all_sum/2)//当前和超过总数和的一半
        return;
    if(sum==all_sum/2){//刚好平分时更新cnt
        res=min(res,cnt);
    }   
    for(int i=0;i<4;i++){//向四个方向搜索
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        if(xx>=0&&xx<n&&yy>=0&&y<m&&!vis[xx][yy]){//搜索的格子在范围内且没有搜索过
            vis[xx][yy]=1;
            dfs(xx,yy,sum+map[xx][yy],cnt+1);
            vis[xx][yy]=0;
        }
    }
}

int main(){
    cin>>m>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>map[i][j];
            all_sum+=map[i][j];
        }
    }

    memset(vis,0,sizeof(vis));
    vis[0][0]=1;//从左上角格子开始遍历搜索
    dfs(0,0,map[0][0],1);
    if(res==404)
        cout<<0<<endl;
    else
        cout<<res<<endl;
}

Insérer ici l'image Description
Insérer ici l'image Description

résumé

Insérer ici l'image Description
En fait, je pense qu'il ya quelque chose à apprendre des routines ou des compétences. MAÎTRISÉES les compétences nécessaires pour apprendre rapidement, pour résoudre le problème la plupart du temps avec assez de compétences.

Publié 85 articles originaux · louange gagné 55 · vues 20000 +

Je suppose que tu aimes

Origine blog.csdn.net/shelgi/article/details/104189019
conseillé
Classement