Cod sursa(job #1662685)

Utilizator petru.cehanCehan Petru petru.cehan Data 24 martie 2016 22:57:32
Problema Problema Damelor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("damesah.in");
ofstream fout("damesah.out");

class Solution {
public:
    vector<vector<string> > solveNQueens(int n) {
        vector<vector<string> > sol;
        intsol.resize(n);
        Helper(sol,n,0);
        return sol;
    }
private:
    vector<string> partSol;
    string part;
    vector<int> intsol; // regina pe o linie
    void Helper(vector<vector<string> > &sol, int n, int l){
        if(l == n){
            for(int i = 0; i < n ; ++ i){
                part = "";
                for(int j = 0 ; j < n ; ++ j)
                    if(intsol[i] == j)
                        part.push_back('Q');
                    else part.push_back('.');
                partSol.push_back(part);
            }
            sol.push_back(partSol);
            return;
        }

        for(int c = 0 ; c < n ; ++ c){
                intsol[l] = c;
                bool ok = 1;
                for(int j = 0 ; j < l ; ++ j){
                    if(intsol[j] == intsol[l] || abs(intsol[l] - intsol[j]) == l-j){
                                    ok = 0; break;
                    }
                }
                if(ok)
                    Helper(sol,n,l+1);
        }
    }
};
int main()
{
    int n;
    fin >> n;
    Solution *p = new Solution();
    vector<vector<string> > s = p->solveNQueens(n);
    vector<int> sl;
    for(int i = 0 ; i < n; ++ i)
        for(int j = 0 ; j < n ; ++ j)
          if(s[0][i][j] == 'Q')
                sl.push_back(j);
    for(int i = 0 ; i < sl.size(); ++ i)
        fout << sl[i] + 1 << " ";
    fout <<"\n" << s.size();
    return 0;
}