回溯法的一个经典实例-n皇后问题

来源:互联网 发布:我国网络舆论的特点是? 编辑:程序博客网 时间:2024/05/17 03:44

 在国际象棋盘上放八个皇后,互相不能攻击,有多少种摆法?
这个是经典的8皇后问题,解决此问题的方法是回溯法。

回溯法是一种思路简单而且有效的解决问题的基础算法。

解决一个问题的时候分成n个步骤,每向后进展一个步骤,就检查一下当前的状态,如果发生了冲突,就放弃,如果到达了目标状态就记录下答案,回溯,求解下一个解。

对于8皇后问题,每个步骤就是在棋盘上放一个棋子,每放一个棋子,就检查当前的状态,有否产生攻击,如果没有攻击,就继续放下一个,如果攻击了,就回溯,如果放够八个,就打印结果,然后回溯。

 

/*
作者:shaoshaoh
日期:2006-10-01
声明:欢迎转载,但请保留此信息
Blog:
http://blog.csdn.net/shaoshaoh

经典的八皇后问题
*/

#include 
"math.h"
#include 
<iostream>
using namespace std;

//全局变量
int n, total;
int stack[20];

void inc(int & x)
{
    x
++;
}


void make(int l)
{
    
if (l == n+1)
    
{
        inc(total);
        cout
<<"Solve "<<total<<endl;

        
for ( int i=1; i<=n ; i++)
        
{
            cout
<<stack[i]<<" ";
        }

        cout
<<endl;
        
return;
    }

    
    bool att;
    
for(int i = 1; i<=n; i++)
    
{
        att 
= false;
        stack[l]
=i;
        
for (int j = 1; j<=l-1;j++)
        
{
            
if ( ( abs(l-j) == abs(stack[j]-i) ) 
                
|| (i== stack[j]) )
            
{
                att
=true;
                j
=l-1;
            }

        }

        
if (!att) make(l+1);
    }

}


        
void main(void)
{
    cout
<<"Please insert the number of queens:"<<endl;
    cin
>>n;
    total 
=0
    
    make(
1);
}
原创粉丝点击