码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2016-03-22 23:20:56      阅读:391      评论:0      收藏:0      [点我收藏+]

标签:

刚开始学习c++,代码有什么问题还欢迎各位指出

//通过修改宏可以解决n皇后的问题
#define MAX 8
#define ABS(x) ((x>0)?(x):-(x))
class Queen
{
private:    
    int queen[MAX] ;
public:
    Queen();
    int Place(int);
    int Attack(int, int);
    int OutData();
    ~Queen();
};
Queen::Queen()
{
    //for (int i = 0; i < MAX; i++)queen[i] = 0;
    std::cout << "hello,welcome to eight Queen ";
    Place(0);

}
//排列下一个皇后
int Queen::Place(int p)
{
    for (int i = 0; i < 8;i++)
    {
        if (!Attack(p, i))
        {
            queen[p] = i;            
            if (p == MAX - 1) OutData();
            else
            {
                Place(p + 1);
            }
        }
        
    }
    return 0;
}
//判断是否收到攻击,受到攻击返回1,否则返回0
int Queen::Attack(int row, int col)
{
    int flag = 0;
        //i<row可以保证不在同一行
    for (int i = 0; i < row && !flag; i++)
    {
        int inc_row = ABS(i - row);
        int inc_col = ABS(queen[i] - col);
                //判断是否在同一列,是否在斜线上
        flag = (col == queen[i]) || (inc_col == inc_row);
    }
    return flag;
}

int Queen::OutData()
{
    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            if (j == queen[i])std::cout << "Q";
            else std::cout << "-";
        }
        std::cout << "\n";
    }
    getchar();
    return 0;
}

Queen::~Queen()
{
    std::cout << "end" << std::endl;
}
int main()
{
    Queen a;
    return 0;
}
    

调试的时候会有一个问题,一直输出结果,经过仔细查看代码看出,由于递归调用,可以输出所有种类的结果,所以得对结果加以区分,加入getchar是为了输出一个结果

八皇后问题

标签:

原文地址:http://www.cnblogs.com/little77/p/5309027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!