Retour en arrière classique : problème de N Queens

Lien letecode correspondant :

51. Reine N - LeetCode (leetcode-cn.com)

Description du sujet:

 

Idées de résolution de problèmes :

Trouvons les règles, regardons d'abord le problème des 4 reines

Par exemple, dans la grille 4*4 suivante, si nous entrons des reines dans l'une des grilles, alors il ne peut y avoir de reines dans cette ligne, cette colonne et les diagonales sur les côtés gauche et droit.

 D'abord, on place une reine dans la première rangée et la première colonne : alors ni sa rangée correspondante ni sa diagonale ne peuvent mettre de reine :

 jusqu'à la deuxième ligne. Dans la deuxième ligne, nous ne pouvons pas entrer la reine dans les première et deuxième colonnes, car il y a un conflit . Mais on peut entrer des reines dans la colonne 3 :

Dans la troisième ligne, nous constatons qu'il y a un conflit dans toute entrée. Cela montre que ce que nous avons choisi auparavant était faux. En revenant à l'étape précédente, nous avons constaté qu'à la deuxième étape, non seulement la troisième colonne peut être sélectionnée, mais également la quatrième colonne peut être sélectionnée. Étant donné que la troisième colonne ne convient pas , nous choisirons la quatrième colonne.

 Il en va de même pour ce dernier, mais lorsque la récursivité revient, elle peut re-tourner la position qui n'a pas pu être tournée à cause du jaunissement précédent.

La difficulté est maintenant de savoir comment étiqueter les colonnes et les diagonales. Colonne et facile, nous pouvons utiliser une balise unordered_set, dans la ligne, nous pouvons revenir au calque suivant immédiatement après avoir placé la reine dans cette ligne, mais qu'en est-il de la ligne diagonale ? C'est un peu compliqué, mais ce n'est pas compliqué. Si la position d'une reine est i, j, alors sa position diagonale est i+1, j+1, i+1, j-1, on trouve qu'il y a une diagonale direction Les coordonnées de la ligne sont soustraites à ij en tant que valeur fixe, et l'ajout des autres coordonnées diagonales est i+j en tant que valeur fixe, nous n'avons donc besoin que d'utiliser un enregistrement de table de hachage.

Pour plus de détails, veuillez consulter

class Solution {
public:
        vector<vector<bool>>visit;//标记某个位置是否放过皇后
        unordered_set<int>col;//标记这一列不能放皇后
        unordered_set<int>pia;//标记对角线不能放皇后
        unordered_set<int>na;
        int _n;//数量
          vector<vector<string>>ans;//记录答案
    vector<vector<string>> solveNQueens(int n) {
               visit.resize(n,vector<bool>(n));//初始化为false;
               this->_n=n;
       
                dfs(0);//递归
               return ans;

    }
    void dfs(int i)
    {
        if(i==_n)//如果已经走到最后一行说明
        {
          ceraterAns();//产生答案了
            return;
        }
        for(int j=0;j<_n;j++)
        {
           if(col.count(j)||pia.count(i+j)||na.count(i-j))//说明被标记过不能够放皇后直接
           //continue即可跳过了
           {
               continue;
           }
           visit[i][j]=true;//标记这个这个位置已经放过皇后
           col.insert(j);//标记这一列不能放皇后
           pia.insert(i+j);//对角线标记
           na.insert(i-j);
           dfs(i+1);//这一层放过了直接到下一层即可
           visit[i][j]=false;//递归返回之后需要将之间的标记去除
           col.erase(j);
           pia.erase(i+j);
           na.erase(i-j);
        }

    }

    void ceraterAns()
    {        
        vector<string>tmp;

        for(int i=0;i<_n;i++)
        {
            string str;
            for(int j=0;j<_n;j++)
            {
                if(visit[i][j])
                {
                   str.push_back('Q');
                }
                else
                {
                  str.push_back('.');
                }
            }
            tmp.push_back(str);
        }
         ans.push_back(tmp);
    }
    
};

52. N Queen II - LeetCode (leetcode-cn.com)

Description du sujet:

 Idées de résolution de problèmes :

Cette question est fondamentalement la même que la précédente, mais c'est une version plus simple de la précédente. L'idée a déjà été mentionnée dans la question ci-dessus, il suffit de copier le code de la question ci-dessus.

Code correspondant :

class Solution {
public:
 vector<vector<bool>>visit;//标记某个位置是否放过皇后
        unordered_set<int>col;//标记这一列不能放皇后
        unordered_set<int>pia;//标记对角线不能放皇后
        unordered_set<int>na;
        int _n;//数量
        int ans=0;
    int totalNQueens(int n) {
           visit.resize(n,vector<bool>(n));//初始化为false;
               this->_n=n;
       
                dfs(0);//递归
               return ans;
    }
      void dfs(int i)
    {
        if(i==_n)//如果已经走到最后一行说明
        {
             ans++;//产生答案了
            return;
        }
        for(int j=0;j<_n;j++)
        {
           if(col.count(j)||pia.count(i+j)||na.count(i-j))//说明被标记过不能够放皇后直接
           //continue即可跳过了
           {
               continue;
           }
           visit[i][j]=true;//标记这个这个位置已经放过皇后
           col.insert(j);//标记这一列不能放皇后
           pia.insert(i+j);//对角线标记
           na.insert(i-j);
           dfs(i+1);//这一层放过了直接到下一层即可
           visit[i][j]=false;//递归返回之后需要将之间的标记去除
           col.erase(j);
           pia.erase(i+j);
           na.erase(i-j);
        }

    }
   
};

Ce qui suit est une question répétée de letecode :

Question d'entretien 08.12. Les huit reines - LeetCode (leetcode-cn.com)

Description du sujet:

 Code correspondant :

class Solution {
public:
        vector<vector<bool>>visit;//标记某个位置是否放过皇后
        unordered_set<int>col;//标记这一列不能放皇后
        unordered_set<int>pia;//标记对角线不能放皇后
        unordered_set<int>na;
        int _n;//数量
          vector<vector<string>>ans;//记录答案
    vector<vector<string>> solveNQueens(int n) {
               visit.resize(n,vector<bool>(n));//初始化为false;
               this->_n=n;
       
                dfs(0);//递归
               return ans;

    }
    void dfs(int i)
    {
        if(i==_n)//如果已经走到最后一行说明
        {
          ceraterAns();//产生答案了
            return;
        }
        for(int j=0;j<_n;j++)
        {
           if(col.count(j)||pia.count(i+j)||na.count(i-j))//说明被标记过不能够放皇后直接
           //continue即可跳过了
           {
               continue;
           }
           visit[i][j]=true;//标记这个这个位置已经放过皇后
           col.insert(j);//标记这一列不能放皇后
           pia.insert(i+j);//对角线标记
           na.insert(i-j);
           dfs(i+1);//这一层放过了直接到下一层即可
           visit[i][j]=false;//递归返回之后需要将之间的标记去除
           col.erase(j);
           pia.erase(i+j);
           na.erase(i-j);
        }

    }

    void ceraterAns()
    {        
        vector<string>tmp;

        for(int i=0;i<_n;i++)
        {
            string str;
            for(int j=0;j<_n;j++)
            {
                if(visit[i][j])
                {
                   str.push_back('Q');
                }
                else
                {
                  str.push_back('.');
                }
            }
            tmp.push_back(str);
        }
         ans.push_back(tmp);
    }
    
};

Je suppose que tu aimes

Origine blog.csdn.net/qq_56999918/article/details/123815923
conseillé
Classement