informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Apa itu kemunduran?
Saat mencari node tertentu, jika kami menemukan bahwa node saat ini (dan sub-nodenya) bukan target yang diperlukan, kami kembali ke node asli untuk melanjutkan pencarian, dan memulihkan status node saat ini yang telah diubah.Ingat dua tip kecil:Yang pertama adalah meneruskan status dengan referensi (&), dan yang kedua adalah mengubah semua modifikasi status setelah rekursi selesai.Umumnya ada dua situasi untuk melakukan modifikasi backtrack. Yang pertama adalah memodifikasi output terakhir, seperti permutasi dan kombinasi, yang lainnya adalah memodifikasi target akses.Ingat, misalnya, mencari string dalam matriks.
temaDiberikan array tanpa nomor duplikat
nums
, kembalikan itusemua kemungkinan permutasi .kamu bisadalam urutan apa punKembalikan jawaban.Contoh 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]Contoh 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]Contoh 3:
输入:nums = [1] 输出:[[1]]petunjuk:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
semua bilangan bulat masukberbeda satu sama lain
menjawabUntuk menampilkan semua kombinasi array yang diurutkan, kita dapat menggunakan metode backtracking.Tentukan dulu suatu posisi, lalu tukarkan dengan setiap posisi berikutnya. Setelah berganti, pergi ke lokasi berikutnya. Kemudian setelah rangkaian langkah ini selesai, Anda perlu mengganti yang diganti. Itu adalah metode kemunduran.![]()
- 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
Diberikan dua bilangan bulat
n
Dank
, rentang pengembalian[1, n]
semua mungkin masukk
kombinasi angka.Anda dapat menekanada pesananKembalikan jawaban.
Contoh 1:
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]Contoh 2:
输入:n = 1, k = 1 输出:[[1]]petunjuk:
1 <= n <= 20
1 <= k <= n
题解
Tetapkan hitungan dan hitung jumlahnya masing-masing. Saat count==k, masukkan ke dalam array. Berbeda dengan sebelumnya yang merupakan permutasi dan kombinasi. Ini seperti memilih sebuah array.
Mulai dari 1-n, siapkan array tambahan untuk menyimpan hasil setiap kali. Hitungan berubah secara dinamis. Setelah menetapkan i, hitungan bertambah satu, dan nomor dipilih dari (i+1, n) di dfs. Hitung-- setelah menelusuri kembali.
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
diberikan a
m x n
Kisi karakter 2Dboard
dan kata stringword
.jikaword
ada di grid, kembalitrue
; Jika tidak, kembalikanfalse
。Kata-kata harus dibentuk dari huruf-huruf dalam sel yang berdekatan sesuai urutan abjad, di mana sel yang "berdekatan" adalah sel yang berdekatan secara horizontal atau vertikal. Huruf dalam sel yang sama tidak boleh digunakan berulang kali.
Contoh 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:trueContoh 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:trueContoh 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:falsepetunjuk:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
Danword
Hanya terdiri dari huruf besar dan kecil bahasa Inggris
menjawab
Rutinitas serupa.
Metode dfs + backtracking pertama-tama menentukan kunjungan untuk menandai apakah lokasi telah ditandai selama setiap pencarian untuk mencegah lokasi yang sama dikunjungi berkali-kali.
Untuk suatu lokasi, penilaian batas perlu dilakukan untuk menentukan apakah lokasi tersebut melintasi batas. Kemudian tentukan apakah sudah dikunjungi, apakah berhasil ditemukan, dan apakah surat pada posisinya berbeda dengan surat sasaran.
dfs, cari di sekitar.
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
Menurut aturan catur, seorang ratu dapat menyerang bidak pada baris atau kolom yang sama atau pada diagonal yang sama.
n Masalah RatuYang dipelajari adalah bagaimana caranya
n
ratu ditempatkan din×n
di papan catur, dan membuat para ratu tidak bisa saling menyerang.Memberi Anda bilangan bulat
n
, mengembalikan semua berbedaN masalah ratusolusinya.Setiap solusi mengandung yang berbedan Masalah RatuRencana penempatan bidak catur, dalam rencana ini
'Q'
Dan'.'
Mereka masing-masing mewakili ratu dan kursi kosong.Contoh 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。Contoh 2:
输入:n = 1 输出:[["Q"]]petunjuk:
1 <= n <= 9
题意
N Queen memerlukan tiga fungsi pelabelan, satu adalah kolom, satu adalah diagonal utama, dan yang lainnya adalah diagonal sekunder.
Karena pasti akan ada ratu yang ditempatkan di setiap baris, maka itu dilalui baris demi baris. Bila baris terakhir berhasil dilalui dan ratu berhasil ditempatkan, itu sudah cukup. Jadi tidak perlu mengatur fungsi penandaan baris.
Saat ini kita bisa mulai dari baris pertama dan melintasi kolom. Tentukan apakah kolom tersebut salah, apakah diagonal utama salah, dan apakah diagonal sekunder salah. Jika ya, lanjutkan ke kolom berikutnya. Jika tidak, atur posisinya ke Q, lalu lakukan pencarian yang sama untuk baris berikutnya. Metode mundur, ingatlah untuk mengembalikan posisi dan fungsi penandaan setelah pencarian.
Ini diagonal dan subdiagonal. Dapat digambarkan pada koordinatnya, yang satu adalah y=x+b, yang lainnya adalah y=-x+b.
Jadi b=yx, untuk membuat b>0, maka kita tambahkan n. Yang lainnya adalah 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; } } };
Meringkaskan
Untuk metode backtracking, cari dulu syarat batas dan syarat akhir. Umumnya, set i sama dengan jumlah baris.
Syarat batas umumnya tidak melewati batas.
Umumnya, fungsi penandaan perlu diatur. Kemudian akses baris demi baris atau posisi demi posisi, dan fungsi tag yang dikunjungi disetel ke true. Kemudian lanjutkan ke baris berikutnya atau selanjutnya (biasanya secara rekursif). Kemudian kembalikan fungsi penandaan dan papan di atas setelah selesai (biasanya akan ditetapkan satu sebagai jawabannya). Jika cocok, push_back ke array ans.