示例#1
0
void fill_queens(int mat[N_QUEEN][N_QUEEN])
{
	int prob[N_QUEEN] = {0};
	int m = 0, n = 0, nqueens = 0;

	while (1) {
		for (m = 0;m >= 0 && m < N_QUEEN;) {
			while ((m < N_QUEEN) && (prob[m] < N_QUEEN)) {
				if (!is_conflict(mat, m, prob[m])) {
					mat[m][prob[m]] = 1;
					nqueens++;
					m++;
					continue;
				}
				prob[m]++;
			}
			if (nqueens == N_QUEEN)
				break;
			while (prob[m] >= N_QUEEN) {
				print_board(mat);
				printf ("\n");
				assert(m);
				prob[m] = 0;
				m--;
				assert(mat[m][prob[m]]);
				mat[m][prob[m]] = 0;
				prob[m]++;
				nqueens--;
			}
		}
		if (nqueens == N_QUEEN)
			break;
	}
}
示例#2
0
// 解决N皇后问题
int queen(int n)
{
	int count = 0;
	int a[MAX_LENGTH];
	init_board(a, n);
	int i = 0;
	while ( 1 )
	{
		if ( a[i] < n )
		{
			// 如果皇后的位置尚未超出棋盘范围
			// 需要检查第i行的皇后是否与前i-1行的皇后冲突
			if ( is_conflict(a, i) )
			{
				// 如果冲突,尝试下一个位置
				a[i]++;
				continue;
			}
			if ( i >= n - 1 )
			{
				// 如果已经到最后一行,也即找到一个解,首先输出它
				count++;
				print_board(a, n);
				// 然后尝试当前行的皇后的下一个位置
				a[n-1]++;
				continue;
			}
			// 没有冲突,尝试下一行
			i++;
			continue;
		}
		else
		{
			// 皇后的位置已经超出棋盘范围
			// 那么该行的皇后复位
			a[i] = 0; // 可以省略...??
			// 回退到上一行
			i--;
			if ( i < 0 )
			{
				// 已经不能再退了,函数结束
				return count;
			}
			// 尝试上一行的皇后的下个位置
			a[i]++;
			continue;
		}
	}
}