| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 525 人关注过本帖
标题:求教八皇后问题,枚举算法
只看楼主 加入收藏
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求教八皇后问题,枚举算法
我知道回溯法很简单,但是看不懂啊,结果看到了枚举法,俺的娘,还是看不懂,大家帮忙分析下,谢谢,枚举法应该是用总的办法减去受条件拘束的办法,可是还是没思路
程序代码:
#include <iostream>
using namespace std;
bool check_1(int a[],int n)
{
for(int i=2;i<=n;i++)//bool是怎么判断的
{
    for(int j=1;j<=i-1;j++)
    {
        if ((a[i]==a[j])||(abs(a[i]-a[j])==i-j))
        {
            return false;
        }
    }
}
return true;
}
void queens_1()
{
    int a[9];
    int count = 0;
    for(a[1]=1;a[1]<=8;a[1]++)//这一大串for是用来干嘛的,可不可以算出执行一次后的结果
    {
        for(a[2]=1;a[2]<=8;a[2]++)
        {
            for(a[3]=1;a[3]<=8;a[3]++)
            {
                for(a[4]=1;a[4]<=8;a[4]++)
                {
                    for(a[5]=1;a[5]<=8;a[5]++)
                    {
                        for(a[6]=1;a[6]<=8;a[6]++)
                        {
                            for(a[7]=1;a[7]<=8;a[7]++)
                            {
                                for(a[8]=1;a[8]<=8;a[8]++)
                                {
                                    if(!check_1(a,8)) 
                                        continue;
                                    else
                                    {
                                        for(int i=1;i<=8;i++) //这里是什么意思
                                        {
                                            cout<<a[i];
                                        }
                                        cout<<endl;
                                        count++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<count<<endl;
}
void main()
{
    queens_1();
}
2014-08-18 22:45
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-18 22:56
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
求解啊!!

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-19 12:53
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:20 
程序代码:


 if ((a[i]==a[j])||(abs(a[i]-a[j])==i-j))
//a[i]==a[j]用来判断是否在同一直线上,而abs(a[i]-a[j])==i-j判断是否在同一斜线上。


程序代码:

 if(!check_1(a,8))           //通过调用check_1()来判断是否符合条件.不符合则继续循环,符合则输出排列情况.
    continue;

 else
    {
        for(int i=1;i<=8;i++) //这里是什么意思   //输出符合条件的排列.
         {                    
             cout<<a[i];
         }
         cout<<endl;
         count++;
    }


个人认为这个问题如果使用两位数来表示输出结果的话,可能更明了一些.
比如对于输出的最后一种情况: 84136275来说,
使用18,24,31,43,56,62.77,85这样的表示方法更好一些.前面的数字表示行,后面的数字表示列(反之亦可,可以认为视角转换了90度).

这个算法没有考虑到视角转换带来的问题. 如果把视角转换考虑进去的话, 实际的方法要少至少一半.因为同一个排列方式,转换一下视角还是一样的,只是观察角度不同而已,但程序依然认为是两种不同的方式.84136275<=>57263148,这其实是同一种排列方式,程序认为是两种.

代码测试环境:  WinXP+C-Free5.0.
2014-08-19 13:35
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 4 楼 vvvcuu
斑竹,炒鸡感谢

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-19 15:46
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 4 楼 vvvcuu
确实,二维更好一点!!a[]咋一看还不知道是定义的行还是列!

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-19 15:49
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 4 楼 vvvcuu
忘了,还有中间一大堆for的嵌套是什么意思,我觉得应该是列出所有摆放方法,但是不明白for括号里的循环条件,例如for(a[1]=1;a[1]<=8;a[1]++)我觉得a[1]里的1代表的是行,而=的1是列,a[1]++应该是第一行坐标的表示方法对吧

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-19 15:56
快速回复:求教八皇后问题,枚举算法
数据加载中...
 
   



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

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