Thanks to the video of Stanford cs106b lecture ten by Julie Zelenski for the nice explanation of recursion and backtracking , highly recommended.
N-queens (12ms)
classSolution { vector<vector<string>>AnsintN//int Numofsol; voidAddto_ans (string&conf) { vector<string>vecstrtmp;stringStrtmp (N,'. '); for(Autoind:conf) {vecstrtmp.push_back (strtmp); Vecstrtmp.back () [(size_t) ind-1]=' Q '; } ans.push_back ( vector<string>()); Ans.back (). Swap (VECSTRTMP); }voidReclistnqueens (stringSofar,stringRest) {if(Rest.empty ()) {//++numofsol;Addto_ans (SOFAR); }Else{intI,j,len=sofar.size (), flag; for(i=0; I<rest.size (); ++i) { for(j=0; j<len;++j) {flag=1;if(Sofar[j]-rest[i]==len-j | | sofar[j]-rest[i]==j-len) {flag=0; Break; } }if(flag) Reclistnqueens (Sofar+rest[i],rest.substr (0, i) +rest.substr (i+1)); } } } Public: vector<vector<string>>Solvenqueens (intN) {ans.clear ();//numofsol=0;N=n;stringStr for(intI=1; i<=n;++i) Str.push_back (i); Reclistnqueens ("", str);returnAns }};
With a tiny modification,
N-queens II (8ms)
Class Solution {//vector<vector<string>> ans; intNintNumofsol;/*void Addto_ans (string &conf) {vector<string> vecstrtmp; String strtmp (N, '. '); for (auto ind:conf) {vecstrtmp.push_back (strtmp); Vecstrtmp.back () [(size_t) ind-1]= ' Q '; } ans.push_back (Vector<string> ()); Ans.back (). Swap (VECSTRTMP); }*/ voidReclistnqueens (stringSofar,stringRest) {if(Rest.empty ()) {++numofsol;//addto_ans (SOFAR);}Else{intI,j,len=sofar.size (), flag; for(i=0; I<rest.size (); ++i) { for(j=0; j<len;++j) {flag=1;if(Sofar[j]-rest[i]==len-j | | sofar[j]-rest[i]==j-len) {flag=0; Break; } }if(flag) Reclistnqueens (Sofar+rest[i],rest.substr (0, i) +rest.substr (i+1)); } } } Public:int Totalnqueens(intN) {//ans.clear ();Numofsol=0; N=n;stringStr for(intI=1; i<=n;++i) Str.push_back (i); Reclistnqueens ("", str);returnNumofsol; }};
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Leetcode N-queens/n-queens II, backtracking, C + +