bool (int** mat, int n, pair<int, int>& queen_idx)
{
int row = queen_idx.first ;
int col = queen_idx.second;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(mat[row][j] == 0)
mat[row][j] = 1;
else if(mat[row][j] == 100)
return false;
}
if(mat[i][col] == 0)
mat[i][col] = 1;
else if(mat[i][col] == 100)
return false;
}
for(int i=row, j=col; i>=0 && j>=0; i--, j--)
{
if(mat[i][j] == 0)
mat[i][j] = 1;
else if(mat[i][j] == 100)
return false;
}
for(int i=row, j=col; i<n && j<n; i++, j++)
{
if(mat[i][j] == 0)
mat[i][j] = 1;
else if(mat[i][j] == 100)
return false;
}
for(int i=row, j=col; i<n && j>=0; i++, j--)
{
if(mat[i][j] == 0)
mat[i][j] = 1;
else if(mat[i][j] == 100)
return false;
}
for(int i=row, j=col; i>=0 && j<n; i--, j++)
{
if(mat[i][j] == 0)
mat[i][j] = 1;
else if(mat[i][j] == 100)
return false;
}
mat[row][col] = 100;
return true;
}
int backtrack = 0;
void sol(int** mat, int n, int start_j=0)
{
std::pair<int, int> idx;
vector<pair<int, int>> queens;
vector< vector<pair<int, int>> > queens_v;
if(start_j > n) return ;
for(int i=0; i<n; i++)
{
for(int j= ((i==0)? max(start_j, 0) : 0); j<n; j++)
{
idx = std::make_pair(i, j);
if(one_queen_visited(mat, n, idx))
{
queens.push_back(idx);
}
}
}
if(queens.size() == n)
{
queens_v.push_back(queens);
int** mat_copy = new int*[n] ;
for(int i=0; i<n; i++)
{
mat_copy[i] = new int[n]();
}
for(int i=0; i<queens.size(); i++)
{
idx = queens[i];
mat_copy[idx.first][idx.second] = 1 ;
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout<< mat_copy[i][j] << ' ' ;
cout << endl;
}
}
clean_mat(mat, n);
sol(mat, n, ++backtrack);
}
近期评论