• 八皇后问题(经典算法-回溯法)


    问题描述:       

            八皇后问题(eight queens problem)是十九世纪著名的数学家高斯于1850年提出的。问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击。即任意两个皇后都不能处于同一行、同一列或同一斜线上。

    可以把八皇后问题扩展到n皇后问题,即在n×n的棋盘上摆放n个皇后,使任意两个皇后都不能互相攻击。

    思路:

            使用回溯法依次假设皇后的位置,当第一个皇后确定后,寻找下一行的皇后位置,当满足左上、右上和正上方向无皇后,即矩阵中对应位置都为0,则可以确定皇后位置,依次判断下一行的皇后位置。当到达第8行时,说明八个皇后安置完毕。

    代码如下:

    #include<iostream>
    using namespace std;
    #define N 8
    int a[N][N];
    int count=0;
    
    //判断是否可放
    bool search(int r,int c)
    {
    	int i,j;
    	//左上+正上
    	for(i=r,j=c; i>=0 && j>=0; i--,j--)
    	{
    		if(a[i][j] || a[i][c])
    		{
    			return false;
    		}
    	}
    	//右上
    	for(i=r,j=c; i>=0 && j<N; i--,j++)
    	{
    		if(a[i][j])
    		{
    			return false;
    		}
    	}
    	return true;
    }
    
    //输出
    void print()
    {
    	for(int i=0;i<N;i++)
    	{
    		for(int j=0;j<N;j++)
    		{
    			cout<<a[i][j]<<"  ";
    		}
    		cout<<endl;
    	}
    }
    
    //回溯法查找适合的放法
    void queen(int r)
    {
    	if(r == 8)
    	{
    		count++;
    		cout<<"第"<<count<<"种放法
    ";
    		print();
    		cout<<endl;
    		return;
    	}
    	int i;
    	for(i=0; i<N; i++)
    	{
    		if(search(r,i))
    		{
    			a[r][i] = 1;
    			queen(r+1);
    			a[r][i] = 0;
    		}
    	}
    }
    
    //入口
    int main()
    {
    	queen(0);
    	cout<<"一共有"<<count<<"放法
    ";
    	return 0;
    }

  • 相关阅读:
    工作——为window添加ExtJs添加回车快捷键
    ExtJs_layout_Table
    ExtJs_Grid
    人类和人类对象的使用homework
    简单的Java界面展示
    chapter three Java homework
    for循环语句
    do-while
    switch...季节
    switch的Scanner计算..
  • 原文地址:https://www.cnblogs.com/zhangguixing/p/10858142.html
Copyright © 2020-2023  润新知