问题:
八皇后,水平线、垂直线、对角线位置上不能有能够见面的皇后
分析:
使用回溯法,递归处理。
实际上,用排列组合的思想也行,但是需要更多的检查。
代码:
参考 Slyar 的实现,做了一小些整理;谢谢
1)框架和主函数:
- // EightQueen.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <stdio.h>
- #include <stdlib.h>
- int sum = 0;
- const int max = 8;/* max为棋盘最大坐标 */
- /* 输出所有皇后的坐标 */
- void show(int result[])
- {
- for(int i = 0; i < max; i++)
- {
- printf("(%d,%d) ", i, result[i]);
- }
- printf("/n");
- sum++;
- }
- int main()
- {
- int result[max];
- Queen(result, 0);/* 从横坐标为0开始依次尝试 */
- printf("total: %d enums./n", sum);
- system("pause");
- return 0;
- }
2)是否可以摆放?是否有冲突?
- /* 检查当前列能否放置皇后 */
- bool check(int result[], int x)
- {
- for(int i = 0; i < x; i++)/* 检查横排和对角线上是否可以放置皇后 */
- {
- if(result[i] == result[x]
- || abs(result[i] - result[x]) == (x - i))
- {
- return false;
- }
- }
- return true;
- }
3)递归、回溯主函数
- /* 回溯尝试皇后位置,n为横坐标 */
- void Queen(int result[], int x)
- {
- if(x == max)
- {
- show(result);/* 如果全部摆好,则输出所有皇后的坐标 */
- return;
- }
- // 新的一行里面,皇后可以在任何位置:0->max,***
- // 所以i=0->max,而不是i=n->max ***
- for(int i = 0; i < max; i++)
- {
- result[x] = i;/* 将皇后摆到当前循环到的位置 */
- if(check(result, x))
- {
- Queen(result, x + 1);/* 否则继续摆放下一个皇后 */
- }
- }
- }
[后记,20081201]
看了一下“地图填色”问题,原来也是使用递归+回溯的解决方案