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

LeetCode N-Queens

2014-12-11 13:01 295 查看

LeetCode N-Queens

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.



Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where
'Q'
and
'.'
both
indicate a queen and an empty space respectively.

For example,

There exist two distinct solutions to the 4-queens puzzle:
[
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]


经典皇后问题,递归回溯搜索。

vector<vector<string> >  res;
bool CanPut(vector<string>& tmp, int row, int col, int n)
{
	int i=0, j=0;

	//row行,col列有'Q'返回false
	for(i=0; i<row; i++)
	{
		if(tmp[i][col] == 'Q')
			return false;
	}

	//row行,col列的左斜对角有'Q'返回false
	for(i=row-1, j=col-1; i>=0 && j>=0; i--, j--)
	{
		if(tmp[i][j] == 'Q')
			return false;
	}

	//row行,col列的右斜对角有'Q'返回false
	for(i=row-1, j=col+1; i>=0 && j<n; i--, j++)
	{
		if(tmp[i][j] == 'Q')
			return false;
	}

	return true;
}
void solve(vector<string>& tmp, int row, int n)
{
	if(row==n)
	{
		res.push_back(tmp);
		return ;
	}
	
	for(int col=0; col<n; col++)
	{
		string s(n, '.');

		if(CanPut(tmp, row, col, n))
		{
			//如果在row行,col列可以放‘S’
			s[col] = 'Q';
			tmp.push_back(s);
			solve(tmp, row+1, n);
			//回溯,递归中很重要的一步
			//如果不满足,则回退一步搜索
			tmp.pop_back();
		}
	}
}
vector<vector<string> > solveNQueens(int n)
{
	if(n == 0)
		return res;

	vector<string> tmp;
	solve(tmp, 0, n);
	return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: