Mi información de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
¿Qué es retroceder?
Al buscar un determinado nodo, si encontramos que el nodo actual (y sus subnodos) no es el objetivo requerido, volvemos al nodo original para continuar la búsqueda y restaurar el estado modificado del nodo actual.Recuerda dos pequeños consejos:La primera es pasar el estado por referencia (&) y la segunda es cambiar todas las modificaciones de estado una vez completada la recursividad.Generalmente hay dos situaciones para las modificaciones de retroceso: una es modificar el último bit de salida, como la permutación y combinación, la otra es modificar el objetivo de acceso.Recuerde, por ejemplo, buscar una cadena en una matriz.
temaDada una matriz sin números duplicados
nums
, devolver sutodas las permutaciones posibles .puedeen cualquier ordenDevolver respuesta.Ejemplo 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]Ejemplo 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]Ejemplo 3:
输入:nums = [1] 输出:[[1]]pista:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
todos los números enteros endiferentes uno del otro
respuestaPara generar todas las combinaciones ordenadas de la matriz, podemos utilizar el método de retroceso.Primero determine una posición y luego cámbiela con cada posición posterior. Después de cambiar, vaya a la siguiente ubicación. Luego, una vez completada esta serie de pasos, deberá reemplazar los reemplazados. Ese es el método de retroceso.![]()
- class Solution {
- public:
- vector<vector<int>> permute(vector<int>& nums) {
- vector<vector<int>> ans;
- back(nums,0,ans);
- return ans;
- }
- void back(vector<int>& nums,int n,vector<vector<int>>& ans){
- int i;
- if(n==nums.size()-1)
- ans.push_back(nums);
- for(i=n;i<nums.size();i++){
- swap(nums[i],nums[n]);
- back(nums,n+1,ans);
- swap(nums[i],nums[n]);
- }
- }
- };
tema
Dados dos números enteros
n
yk
, rango de retorno[1, n]
todo lo posible enk
combinación de números.puedes presionarcualquier ordenDevolver respuesta.
Ejemplo 1:
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]Ejemplo 2:
输入:n = 1, k = 1 输出:[[1]]pista:
1 <= n <= 20
1 <= k <= n
题解
Establezca un recuento y calcule el número de cada uno. Cuando count==k, colóquelo en la matriz. Este es diferente a los anteriores, que eran permutaciones y combinaciones. Esto es un poco como seleccionar una matriz.
A partir de 1-n, configure una matriz adicional para almacenar los resultados de cada vez. El recuento cambia dinámicamente después de asignar i, el recuento aumenta en uno y se selecciona un número de (i+1, n) en dfs. Contar... después de retroceder.
class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> ans; vector<int> c(k,0); int count; dfs(n,k,1,ans,c,count); return ans; } void dfs(int n,int k,int level,vector<vector<int>>& ans,vector<int>& c,int& count){ int i; if(count==k){ ans.push_back(c); return ; } for(i=level;i<=n;i++){ c[count++]=i; dfs(n,k,i+1,ans,c,count); --count; } } };
tema
dado un
m x n
Cuadrícula de personajes 2Dboard
y una palabra de cadenaword
.siword
existe en la grilla, regresatrue
; De lo contrario, regresefalse
。Las palabras deben formarse a partir de letras en celdas adyacentes en orden alfabético, donde las celdas "adyacentes" son aquellas que están adyacentes horizontal o verticalmente. No se permite el uso repetido de letras en la misma celda.
Ejemplo 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:trueEjemplo 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:trueEjemplo 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:falsepista:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
yword
Compuesto únicamente por letras inglesas mayúsculas y minúsculas.
respuesta
Rutina similar.
El método dfs+backtracking primero define una visita para marcar si la ubicación se ha marcado durante cada búsqueda para evitar que la misma ubicación sea visitada varias veces.
Para una ubicación, se debe realizar un juicio de límites para determinar si cruza el límite. Luego determine si ha sido visitado, si se ha encontrado con éxito y si la letra en esta posición es diferente de la letra de destino.
dfs, busca alrededor.
class Solution { public: bool exist(vector<vector<char>>& board, string word) { if(board.empty()) return false; int m=board.size(),n=board[0].size(); vector<vector<bool>> visit(m,vector<bool>(n,false)); int i,j; bool find=false; for(i=0;i<m;i++){ for(j=0;j<n;j++) back(i,j,board,word,find,visit,0); } return find; } void back(int i,int j,vector<vector<char>>& board,string& word, bool& find,vector<vector<bool>>& visit,int level){ if(i<0||i>=board.size()||j<0||j>=board[0].size()) return ; if(visit[i][j]||find||board[i][j]!=word[level]) return ; if(level==word.size()-1){ find=true; return ; } visit[i][j]=true; back(i+1,j,board,word,find,visit,level+1); back(i-1,j,board,word,find,visit,level+1); back(i,j+1,board,word,find,visit,level+1); back(i,j-1,board,word,find,visit,level+1); visit[i][j]=false; } };
tema
Según las reglas del ajedrez, una reina puede atacar una pieza de la misma fila o columna o de la misma diagonal.
n problema de la reinaLo que se estudia es cómo
n
reina colocada enn×n
en el tablero de ajedrez y hacer que las reinas no puedan atacarse entre sí.darte un numero entero
n
, devuelve todo diferentenorte problema de la reinas solución.Cada solución contiene un diferenten problema de la reinaEl plan de colocación de piezas de ajedrez, en este plan.
'Q'
y'.'
Representan a la reina y el asiento vacío respectivamente.Ejemplo 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。Ejemplo 2:
输入:n = 1 输出:[["Q"]]pista:
1 <= n <= 9
题意
N Queen requiere tres funciones de etiquetado, una es la columna, una es la diagonal principal y la otra es la diagonal secundaria.
Debido a que definitivamente habrá una reina colocada en cada fila, se recorre fila por fila. Cuando la última fila se atraviesa con éxito y la reina se coloca con éxito, es suficiente. Por lo tanto, no es necesario configurar la función de marcado de filas.
En este momento podemos comenzar desde la primera fila y recorrer por columnas. Determine si la columna es falsa, si la diagonal principal es falsa y si la diagonal secundaria es falsa. Si es así, vaya a la siguiente columna. Si no, establezca la posición en Q y luego realice la misma búsqueda para la siguiente fila. Método de retroceso, recuerde restaurar la posición y las funciones de marcado después de la búsqueda.
Esta diagonal y subdiagonal. Se puede dibujar en las coordenadas, una es y=x+b, la otra es y=-x+b.
Entonces b=yx, para hacer b>0, entonces sumamos n. El otro es y+x.
class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> ans; if(n==0) return {}; vector<string> board(n,string(n,'.')); vector<bool> c(n,false),l(2*n-1,false),r(2*n-1,false); back(n,ans,board,c,l,r,0); return ans; } void back(int n,vector<vector<string>>& ans,vector<string>& board,vector<bool>& c, vector<bool>& l,vector<bool>& r,int row){ if(row==n){ ans.push_back(board); return ; } int i; for(i=0;i<n;i++){ if(c[i]||l[row-i+n]||r[row+i]){ continue; } board[row][i]='Q'; c[i]=l[row-i+n]=r[row+i]=true; back(n,ans,board,c,l,r,row+1); board[row][i]='.'; c[i]=l[row-i+n]=r[row+i]=false; } } };
Resumir
Para el método de retroceso, primero encuentre las condiciones de contorno y las condiciones finales. Generalmente, el conjunto i es igual al número de filas.
La condición de contorno generalmente es no cruzar el límite.
Generalmente, es necesario configurar una función de marcado. Luego acceda línea por línea o posición por posición, y la función de etiqueta visitada se establece en verdadero. Luego continúe con la siguiente o la siguiente línea (generalmente de forma recursiva). Luego restaure la función de marcado anterior y el tablero después de terminar (generalmente se establecerá uno como respuesta). Si coincide, retroceda a la matriz ans.