N皇后问题

USACO Chapter 1 最后一题

此题HINT1的伪代码
function placequeen(column) {   # place columns 0..max-1
	if (column == max) { deal with answer; return; }
	for (row = 0; row < max; row++)  {
		if (canplacequeen (row)) {
			mark queen placed at column,row;
			placequeen(column+1);
			un-mark queen placed at column,row;
		}
	}
}

我的代码,由于N皇后问题具有对称性,还可以对其优化。
int cnt = 0;
int n = 8;
int m[14][14] = {0};
int rowflag[14] = {0}; /* 加快检查 */
int updiagflag[28] = {0}; /* i+j 向上对角线相加是相等的 代替函数检查 */
int downdiagflag[28] = {0}; /* i-j 向下对角线想减绝对值是相等的 */

void preDFS(int row, int col)
{
	rowflag[row] = 1;
	m[row][col] = 1;
	updiagflag[row+col] = 1;
	downdiagflag[row-col+n] = 1;
}

void afterDFS(int row, int col)
{
	rowflag[row] = 0;
	m[row][col] = 0;
	updiagflag[row+col] = 0;
	downdiagflag[row-col+n] = 0;
}

void DFS(int col)
{
	int row;
	if(col == n + 1) {
		cnt++;
	}
	for(row = 1; row <= n; row++) {
		if(!rowflag[row] && !updiagflag[row+col] && !downdiagflag[row-col+n]) {
			preDFS(row, col);
			DFS(col+1);
			afterDFS(row, col);
		}
	}
}


还有一个非递归实现的代码,并且只用一维数组实现,想看的话,猛击这里 http://blog.csdn.net/PinkRobin/archive/2010/03/14/5378702.aspx学习下回溯是怎么写的。

你可能感兴趣的:(数据结构,算法)