2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
पश्चात्तापः किम् ?
कस्यचित् नोडस्य अन्वेषणकाले यदि वयं पश्यामः यत् वर्तमानः नोड् (तस्य उपनोड् च) आवश्यकं लक्ष्यं नास्ति तर्हि वयं अन्वेषणं निरन्तरं कर्तुं मूलनोड् प्रति पुनः पतामः, वर्तमाननोड् इत्यस्य परिवर्तितां स्थितिं च पुनः स्थापयामःद्वे लघुयुक्तौ स्मर्यताम् : १.प्रथमं सन्दर्भेण (&) स्थितिं पारयितुं, द्वितीयं च पुनरावृत्तिसमाप्तेः अनन्तरं सर्वाणि स्थितिसंशोधनं परिवर्तयितुं ।सामान्यतया पश्चात्तापस्य परिवर्तनस्य कृते द्वौ परिस्थितौ भवतः, यथा क्रमपरिवर्तनं संयोजनं च ।स्मर्यतां यथा, मैट्रिक्समध्ये स्ट्रिंग् अन्वेष्टुं ।
विषयद्वितीयकसङ्ख्यां विना सरणी दत्ता
nums
, return itsसर्वे सम्भाव्य क्रमपरिवर्तनानि .भवान् शक्नोतियथाक्रमम्उत्तरं प्रत्यागच्छतु।उदाहरणम् १ : १.
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]उदाहरणम् २ : १.
输入:nums = [0,1] 输出:[[0,1],[1,0]]उदाहरणम् ३ : १.
输入:nums = [1] 输出:[[1]]संकेत:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
सर्वे पूर्णाङ्काः inपरस्परं भिन्नम्
उत्तरम्एरे इत्यस्य सर्वाणि क्रमबद्धानि संयोजनानि आउटपुट् कर्तुं वयं backtracking मेथड् इत्यस्य उपयोगं कर्तुं शक्नुमः ।प्रथमं स्थानं निर्धारयन्तु, ततः परं प्रत्येकं स्थानेन सह तस्य आदानप्रदानं कुर्वन्तु । परिवर्तनं कृत्वा अग्रिमस्थानं गच्छन्तु । ततः एषा पदमाला समाप्तस्य अनन्तरं भवद्भिः प्रतिस्थापितानि प्रतिस्थापयितुं आवश्यकम् । स पश्चात्तापविधिः ।![]()
- 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]);
- }
- }
- };
विषय
पूर्णाङ्कद्वयं दत्तम्
n
तथाk
, return range[1, n]
सर्वे सम्भवन्ति ink
संख्यासंयोगः ।भवन्तः दबावितुं शक्नुवन्तिकोऽपि आदेशःउत्तरं प्रत्यागच्छतु।
उदाहरणम् १ : १.
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]उदाहरणम् २ : १.
输入:n = 1, k = 1 输出:[[1]]संकेत:
1 <= n <= 20
1 <= k <= n
题解
एकं गणनां सेट् कृत्वा प्रत्येकस्य संख्यां गणयन्तु यदा count==k, तत् सरणीयां स्थापयन्तु । एतत् पूर्वेभ्यः भिन्नम्, ये क्रमपरिवर्तनानि, संयोजनानि च आसन् । इदं किञ्चित् सरणीं चयनं इव अस्ति ।
1-n तः आरभ्य प्रत्येकस्य समयस्य परिणामान् संग्रहीतुं अतिरिक्तं सरणीं स्थापयन्तु । गणना गतिशीलरूपेण परिवर्तते । गणना-- पश्चात्तापस्य अनन्तरम्।
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; } } };
विषय
दत्तः क
m x n
2D वर्णजालम्board
तारशब्दश्चword
.यदिword
जालपुटे विद्यते, प्रत्यागच्छतिtrue
;false
。शब्दानां निर्माणं वर्णमालाक्रमेण समीपस्थेषु कोष्ठकेषु अक्षराणां कृते भवितुमर्हति, यत्र "समीपस्थाः" कोष्ठकाः ते सन्ति ये क्षैतिजरूपेण लम्बरूपेण वा समीपस्थाः सन्ति । एकस्मिन् कोष्ठके अक्षराणां पुनः पुनः प्रयोगः न भवति ।
उदाहरणम् १ : १.
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:trueउदाहरणम् २ : १.
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:trueउदाहरणम् ३ : १.
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:falseसंकेत:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
तथाword
केवलं बृहत्-लघु-आङ्ग्ल-अक्षरैः निर्मितम्
उत्तरम्
तथैव दिनचर्या।
dfs + backtracking विधिः प्रथमं भ्रमणं परिभाषयति यत् प्रत्येकस्मिन् अन्वेषणकाले स्थानं चिह्नितं वा इति चिह्नितुं शक्यते यत् एकमेव स्थानं बहुवारं भ्रमणं न भवति
स्थानस्य कृते सीमां लङ्घयति वा इति निर्धारयितुं सीमानिर्णयः करणीयः । ततः तत् गतं वा, सफलतया प्राप्तं वा, स्थाने स्थितं अक्षरं लक्ष्यपत्रात् भिन्नं वा इति निर्धारयन्तु ।
dfs, परितः अन्वेष्टुम्।
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; } };
विषय
शतरंजस्य नियमानुसारं राज्ञी एकस्मिन् पङ्क्तौ वा स्तम्भे वा एकस्मिन् तिर्यक् वा खण्डे आक्रमणं कर्तुं शक्नोति ।
n राज्ञी समस्यायत् अधीयते तत् कथं करणीयम् इति
n
राज्ञी स्थापिताn×n
शतरंजफलके, राज्ञीः परस्परं आक्रमणं कर्तुं असमर्थाः च कुर्वन्तु।पूर्णाङ्कं ददातु
n
, सर्वाणि भिन्नानि प्रत्यागच्छतिन राज्ञी समस्याs समाधानम् ।प्रत्येकं समाधानं भिन्नं भवतिn राज्ञी समस्याशतरंजस्य खण्डस्य स्थापनयोजना, अस्मिन् योजनायां
'Q'
तथा'.'
ते क्रमशः राज्ञ्याः शून्यपीठस्य च प्रतिनिधित्वं कुर्वन्ति।उदाहरणम् १ : १.
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。उदाहरणम् २ : १.
输入:n = 1 输出:[["Q"]]संकेत:
1 <= n <= 9
题意
N Queen इत्यस्य कृते त्रीणि लेबलिंग् कार्याणि आवश्यकानि सन्ति, एकं स्तम्भः, एकः मुख्यः तिर्यक्, अपरः च गौणः तिर्यक् ।
यतो हि प्रत्येकस्मिन् पङ्क्तौ राज्ञी अवश्यमेव स्थापिता भविष्यति, तदा पङ्क्तिः पङ्क्तिः पारिता भवति यदा अन्तिमपङ्क्तिः सफलतया पारिता भवति, राज्ञी च सफलतया स्थापिता भवति तदा एव पर्याप्तम् । अतः पंक्तिचिह्नकार्यं सेट् कर्तुं आवश्यकता नास्ति ।
अस्मिन् समये वयं प्रथमपङ्क्तौ आरभ्य स्तम्भैः भ्रमितुं शक्नुमः । स्तम्भः मिथ्या वा, मुख्यतिर्यक् मिथ्या वा, गौणतिर्यक् मिथ्या वा इति निर्धारयतु । यदि एवम् अस्ति तर्हि अग्रिमस्तम्भे गच्छन्तु यदि न तर्हि स्थानं Q इति सेट् कुर्वन्तु, ततः अग्रिमपङ्क्तौ समानं अन्वेषणं कुर्वन्तु । Backtracking method, अन्वेषणानन्तरं स्थितिं चिह्नकार्यं च पुनः स्थापयितुं स्मर्यताम् ।
अयं तिर्यक् उपतिर्यक् च । निर्देशाङ्केषु आकर्षितुं शक्यते, एकः y=x+b, अन्यः y=-x+b ।
अतः b=yx, b>0 कर्तुं, अतः वयं n योजयामः। अन्यः य+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; } } };
सारांशं कुरुत
backtracking method कृते प्रथमं boundary conditions, ending conditions च अन्वेष्टुम् । सामान्यतया i समुच्चयः पङ्क्तिसङ्ख्यायाः तुल्यः भवति ।
सीमास्थितिः सामान्यतया सीमां न लङ्घयितुं भवति।
सामान्यतया चिह्नकार्यं सेट् कर्तव्यम् । ततः रेखां रेखां वा स्थानं स्थानं वा अभिगन्तुं, तथा च विगतं टैग् फंक्शन् true इति सेट् भवति । ततः परं वा अग्रिमपङ्क्तौ वा (प्रायः पुनरावर्तनीयरूपेण) गच्छन्तु । ततः परिष्करणानन्तरं उपर्युक्तं चिह्नकार्यं बोर्डं च पुनः स्थापयन्तु (प्रायः उत्तररूपेण एकं सेट् भविष्यति) । यदि मेलनं करोति तर्हि ans सरणीं प्रति push_back ।