Move me

  • 首页
  • About
    • History
  • 技术与技巧
    • 编程
    • 软件
  • ACG
    • 动画欣赏
    • 游戏
  • 随笔
    • 诗赋
    • 观点
    • 吐槽
  • 文章存档
  • 友情链接
Move me
My footprint on web
  1. 首页
  2. 技术与技巧
  3. 编程
  4. 正文

回溯法解决“八皇后”问题

2011年11月26日 3518次阅读 0人点赞 0条评论

回溯法定义:

从问题的某一种可能出发, 搜索从这种情况出发所能达到的所有可能, 当这一条路走到" 尽头 "的时候, 再倒回出发点, 从另一个可能出发, 继续搜索. 这种不断" 回溯 "寻找解的方法,称作" 回溯法 "。

八皇后问题:

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

C语言编程解法:

//by Robin @ http://spdf.sinaapp.com/
#include "stdafx.h"
/*********************************
	C编译器 中应引用以下头文件
	#include 
	#include 
	#include 
**********************************/
 
//为棋盘宽度,最大可定义到28
#define max 8

//控制输出解得个数,0为输出全部解
#define Ctrl 0

//建立辨识棋盘的数组,值为该行中皇后的位置
int queen[max];

//解的标号
int sum = 1;
 
//输出棋盘布局
void show(void)
{
    printf("第%d种解法n", sum);
    int i;
    for(i = 0; i < max; i++)
    {
        for(int j = 0; j < max; j++)
        {
            if(queen[i] == j)
	        printf("O ");
	    else
		printf("- ");
	} 
        printf("n");
    }
    printf("n");
    sum++;
}
 
//检查当前位置能否放置皇后 不能则 return 0
int check(int n)
{
    int i;
    for(i = 0; i < n; i++) { if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i)) { return 0; } } return 1; } //回溯放置棋子 int putPiece(int n) { #if Ctrl if(sum > Ctrl)
	return 0;
#endif
    int i;
    for(i = 0; i < max; i++)
    {       
        queen[n] = i;
        if(check(n)/*横竖斜均无其他王后棋子*/)
        {
            if(n != max - 1)
            {
		putPiece(n + 1);
            }         
            else
            {
                //如果全部摆好,则输出所有皇后的坐标
                show();
            }
        }
    }
    //如果没有可以放置皇后的位置,该树枝被剪除
    return 0;
}
 
int main()
{
    putPiece(0);
    return 0;
}

标签: 暂无
最后更新:2016年11月13日

一树小草

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复

公告

终于能正常访问了,希望这次能撑得久一点。

——2021.11.04

普通的有机生命体;

beta版的智人

总是跳过OP、ED的坏孩子;

有自知之明的变态

COPYRIGHT © 2021 spdf.me. ALL RIGHTS RESERVED.

Theme Kratos by Seaton Jiang. PJAX fork by 小白-白.