您的位置:首页 > 产品设计 > UI/UE

[LeetCode] N-Queens

2014-07-05 07:45 363 查看
N-Queens

//board is 0 for avaliable positons, 1 for the other
int board[100][100];
int queenPos[100];
int N;
int solutionNum = 0;
vector<vector<string> > result;

void dfs(int k)
{
if(k == N)
{//the last queen has been put properly
solutionNum++;
vector<string> cur;
for(int i = 0;i < N;i++)
{
string column= "";
for(int j = 0;j < N;j++)
{
if(queenPos[i] == j)
column += "Q";
else
column += ".";
}
//        cout << column << endl;
cur.push_back(column);
}
//    cout << endl << endl;
result.push_back(cur);
return;
}

for(int i = 0;i < N;i++)
{
//search for a postion for the current queen
bool flag = true;

if(board[i][k] == 0)
{
list<int> lastX, lastY;
//this is a good postion for the k th column queen.
queenPos[k] = i;//in the ith row, kth column
//change the board state to mark its attark region.
for(int j = 0;j < N;j++)
{
if(board[i][j] == 0)
{
board[i][j] = 1;
lastX.push_back(i);
lastY.push_back(j);
//    cout << i << " " << j << endl;
}
if(board[j][k] == 0)
{
board[j][k] = 1;
lastX.push_back(j);
lastY.push_back(k);
//cout << j << " " << k << endl;
}
//
if(i - j >= 0 && k - j >= 0 && board[i - j][k - j] == 0)
{
//left up
lastX.push_back(i - j);
lastY.push_back(k - j);
board[i - j][k - j] = 1;

//cout << i -j  << " " << k - j << endl;
}
if(i - j >= 0 && k + j < N && board[i - j][k + j] == 0)
{
lastX.push_back(i - j);
lastY.push_back(k + j);
board[i - j][k + j] = 1;
//cout << i -j  << " " << k + j << endl;
}
if(i + j < N && k - j >= 0 && board[i + j][k - j] == 0)
{
lastX.push_back(i + j);
lastY.push_back(k - j);
board[i + j][k - j] = 1;
//    cout << i + j  << " " << k - j << endl;
}
if(i + j < N && k + j < N && board[i + j][k + j] == 0)
{
lastX.push_back(i + j);
lastY.push_back(k + j);
board[i + j][k + j] = 1;
//    cout << i + j  << " " << k + j << endl;
}
}

//cout << "put the " << k << " queen at " << i << " size = " << lastX.size() << endl;

dfs(k + 1);

//cout << "size = " << lastX.size() << endl;
//back to the previous state.
int num = lastX.size();
for(int t = 0;t < num;t++)
{
int x = lastX.front();
lastX.pop_front();
int y = lastY.front();
lastY.pop_front();
board[x][y] = 0;
//        cout << x << " " << y << endl;
}
}
else
continue;
}

}

vector<vector<string> > solveNQueens(int n) {
N = n;
solutionNum = 0;
for(int i = 0;i < 100;i++)
{
for(int j = 0;j < 100;j++)
board[i][j] = 0;
queenPos[i] = 0;
}
dfs(0);
return result;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: