Recursion + vector + string leetcode 51. N queen +52. N queen II

Reina n

El problema de la reina n estudia cómo colocar n reinas en un tablero de ajedrez n × n y evitar que las reinas se ataquen entre sí.

Inserte la descripción de la imagen aquí

La imagen de arriba muestra una solución al problema de 8 reinas.

Dado un número entero n, devuelve todas las diferentes soluciones n queen.

Cada solución contiene un esquema claro de colocación de piezas problema n-queen, donde 'Q' y '.' Representan a la reina y la vacante, respectivamente.

Ejemplo:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

Explicación: 4 Hay dos soluciones diferentes para el problema de la Reina.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/n-queens Los
derechos de autor pertenecen a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

Resuelva el problema de forma
recursiva, comenzando desde la primera fila, intente colocar las piezas en cada columna, la condición de la siguiente capa de recursión es que no hay piezas directamente sobre el número, no hay piezas en el lado izquierdo y no hay piezas en el lado derecho;

Inicialice n '.' En cada fila primero, y coloque la pieza de ajedrez con el valor Q y opere línea por línea;

class Solution {
    private:
        vector<vector<string>> result;      //存放结果
        vector<string> tmp;             //存放每一个结果
public:
    vector<vector<string>> solveNQueens(int n) {
        string line(n,'.');
        NQueens(line,0,n);
        return result;
    }
    private:
        void NQueens(string &line,int k, int n)     //line的初始化,第k行,一共n行
        {
            if(n==k) 
            {
                result.push_back(tmp);
                return;
            }

            for(int i=0;i<n;i++)
                {
                    if(Check(k,i,n)){
                        line[i]='Q';          //单引号
                        tmp.push_back(line);
                        line[i]='.';
                        NQueens(line , k+1, n);
                        tmp.pop_back();
                    }
                }
        }
        bool Check(int row, int col, int n)
        {
            for (int i =0;i<row;i++)
                if(tmp[i][col]=='Q')
                return false;

            for(int i=row-1,j =col-1;i>=0&&j>=0;i--,j-- )
                if(tmp[i][j]=='Q')
                return false;
            
            for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)
                if(tmp[i][j]=='Q')
                return false;
            return true;
        }
};

Presta atención al
uso de la cadena:

	string line(n,'.');      //构造line对象

52. Reina N II

El problema de la reina n estudia cómo colocar n reinas en un tablero de ajedrez n × n y evitar que las reinas se ataquen entre sí.

Inserte la descripción de la imagen aquí
La imagen de arriba muestra una solución al problema de 8 reinas.

Dado un número entero n, devuelve el número de soluciones diferentes para n reinas.

Ejemplo:

Entrada: 4
Salida: 2
Explicación: 4 Hay dos soluciones diferentes para el problema de la reina.

[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/n-queens-ii Los
derechos de autor pertenecen a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

Resuelva el problema Las
dos preguntas son las mismas: esta pregunta es para encontrar un total de varios métodos, es decir, cambiar el tablero de ajedrez guardado de la pregunta anterior al registro de número +1;
aún necesita un conjunto para guardar el tablero de ajedrez, y el conjunto de cadenas puede reducir el número de dimensiones;

class Solution {
int count=0;
vector<string> pos;

public:
    int totalNQueens(int n) {
        string line(n,'0');
        for(int i=0;i<n;i++)
            pos.push_back(line);
        NQueen(pos,n,0);
        return count;
    }

private:
    void NQueen(vector<string> &pos,int n, int k)        //第k层的位置
    {
        if(k==n)
        {
            count++;
            return;
        }

        for(int i=0;i<n;i++)
        {
            if(Check(i,k,n))
            {
                pos[k][i]='1';
                NQueen(pos,n,k+1);
                pos[k][i]='0';
            }
        }
    }

    bool Check(int i,int k, int n)
    {
        for(int t=0;t<k;t++)
            if(pos[t][i]=='1') 
                return false;

        for(int m=k-1,j=i-1;m>=0&&j>=0;m--,j--)
            if(pos[m][j]=='1')
                return false;
                
        for(int m=k-1,j=i+1;m>=0&&j<n;m--,j++)
            if(pos[m][j]=='1')
                return false;

        return true;
    }
};

Tenga en cuenta que
la posición pasada a la función necesita usar el tipo de referencia, o puede llamarse directamente dentro de la función sin pasarla a la función;

void NQueen(int n, int k)        //第k层的位置

El tipo de
vector de resumen <cadena> es muy adecuado para jugar al tablero de ajedrez;
función de inicialización de cadena (n, '.');

Publicados 105 artículos originales · ganado elogios 6 · vistas 4938

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105620751
Recomendado
Clasificación