| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1436 人关注过本帖, 1 人收藏
标题:八皇后的另一种解法
只看楼主 加入收藏
romance_hot
Rank: 2
等 级:论坛游民
帖 子:6
专家分:20
注 册:2009-9-12
收藏(1)
 问题点数:0 回复次数:5 
八皇后的另一种解法
   最近在这里的论坛看到了一个八皇后的问题,此题本人觉得这个题目是一种典型的递归算法
这个算法用一维数组就可以实现了,把数组的每个下标对应一个皇后所在的列位置,这样就可以排除了各个皇后在同一列的可能,
此题的思维是这样的,先在queue[0]位置放皇后 看这个数组的值是多少 就是在0列的第几行放皇后 最后输出的时候转化成二维数组就可以了,
最后要判断 每个皇后不能再同一行 也不能在同一对角线就可以了,要说其具体的思想 真的很难说,还是把代码贴上来给你们看看好了:
#include <stdio.h>
#include <conio.h>

#define TRUE 1
#define FALSE 0
#define MAXQUEEN 8
#define ABS(x)  ((x>0)?(x):-(x))

int queen[MAXQUEEN];
int total_solution;

void place(int);
int attack(int,int);
void output_solution();


void main(void)
{
    place(0);
}

void place(int q)
{
    int i;
    i=0;
    while (i<MAXQUEEN)
    {
        if (!attack(i,q))
        {
            queen[q]=i;
            if (q==7)
            {
                output_solution();
            }
            else
                place(q+1);
        }
        i++;
    }
}


int attack(int row,int col)
{
    int i,atk=FALSE;
    int offset_row,offset_col;
    i=0;
    while (!atk && i<col)
    {
        offset_col=ABS(i-col);//i表示皇后所在的列位置,col表示第二个皇后所在的列位置
        offset_row=ABS(queen[i]-row);//表示皇后所在的行位置 和第二个皇后所在的行位置,用来比较两个皇后是否在同一对角线;
        atk=(queen[i]==row)||(offset_row==offset_col);//判断两个皇后是否在同一行,是否是在对角线;
        i++;
    }   
    return atk;
}

void output_solution()
{
    int x,y;
    total_solution+=1;
    printf("solution #%3d\n",total_solution);
    for (x=0;x<MAXQUEEN;x++)
    {
        for (y=0;y<MAXQUEEN;y++)
        {
            if (x==queen[y])
            {
                printf("Q");
            }
            else
            {
                printf("-");
            }
        }
        printf("\n");
    }
    printf("\n");
}

可以列出总共的排列种类,大家自己琢磨吧 我觉得这样写起来大家应该容易理解!
搜索更多相关主题的帖子: 解法 皇后 
2009-09-14 11:37
hwdwow
Rank: 2
等 级:论坛游民
帖 子:119
专家分:98
注 册:2009-3-21
收藏
得分:0 
一般数据结构书上都有吧,都用一维数组解决的,并且对角线也是可以编号的。当然一些鱼目混珠的垃圾书上是用最笨的二维数组的,还号称X天学会!
2009-09-16 20:51
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
本来就是一维数组解决。只需记录各皇后所在的列号就行。
有的书用二维只是方便理解。

倚天照海花无数,流水高山心自知。
2009-09-18 19:17
romance_hot
Rank: 2
等 级:论坛游民
帖 子:6
专家分:20
注 册:2009-9-12
收藏
得分:0 
回复 2楼 hwdwow
其实二维他是一种比较容易理解的算法,用二维的话也是可以实现,只是要多几个变量而已!
2009-09-19 09:46
lls407063674
Rank: 1
等 级:新手上路
帖 子:23
专家分:2
注 册:2009-9-4
收藏
得分:0 
到目前为止,我一直没有能够解决这一问题,很遗憾!!!
2009-09-24 11:12
流氓之父
Rank: 2
来 自:新疆
等 级:论坛游民
帖 子:104
专家分:72
注 册:2009-6-2
收藏
得分:0 
谢谢楼主了
2010-05-25 12:44
快速回复:八皇后的另一种解法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017831 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved