int main(){ while(scanf("%d", &n) == 1){ memset(used, 0, sizeof(used)); total = 0; nQueens(0); /* Call this to start recursion */ printf("Total valid configurations for n=%d: %d\n", n,total); } return 0; }
vector<vector<string> > solveNQueens(int n) { vector<vector<string> > res; vector<string> nQueens(n, string(n, '.')); vector<bool> flag_col(n, false); // indicate if the column had a queen before vector<bool> flag_45(2 * n - 1, false); // indicate if the 45° diagonal had a queen before. vector<bool> flag_135(2 * n - 1, false); // indicate if the 135° diagonal had a queen before. solveNQueens(res, nQueens, flag_col, flag_45, flag_135, 0, n); return res; }
void main(){ int n,i,j,k; printf("\nNo of Queens : "); scanf("%d",&n); int x[n+1]; memset(x,0,sizeof(x)); /* x[1] = 1; i=1,j=2,k=2; printf("\n%d %d",place(2,1,x),place(2,2,x)); */ nQueens(1,n,x); }
void nQueens(int i, int n, int *x){ int j; if(i>n){ printSol(x,n); // exit(0); } for(j=1; j<=n; j++){ if(place(i,j,x)){ x[i] = j; nQueens(i+1,n,x); } } }
bool NQueens::test() { vector<vector<int>> res = nQueens(4); vector<int> ans1 = {1, 3, 0, 2}; vector<int> ans2 = {2, 0, 3, 1}; for (vector<int> vec : res) { if (vec != ans1 && vec != ans2) { cout << "Wrong ans " << endl; cout << vec_to_string(vec) << endl; return false; } } return true; }
void nQueens(int pos){ int i, j; if(pos == n){ total++; for(i = 0; i < n; i++) printf("(%d,%d)%c", i, S[i], i == n-1 ? '\n' : ' '); return; } for(i = 0; i < n; i++){ if(used[i]) continue; for(j = 0; j < pos; j++) if(pos-j == abs(i-S[j])) break; if(j == pos){ S[pos] = i; used[i] = 1; nQueens(pos+1); used[i] = 0; } } }