hdu2553n皇后------回溯算法

定义:

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。

但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,

而满足回溯条件的某个状态的点称为“回溯点”。

 

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip> 
using namespace std;
int N;
int a[11]; 
int ans; 
//i表示第几行,a[i]表示第几列 
bool judge(int r)
{
    for(int i=1;i<r;i++)
    {
        if(a[r]==a[i]||abs(a[r]-a[i])==abs(i-r))
          return 0;
    }
    return 1;
}
void hang(int r)
{
    if(r>N)
     ans++;
    else
    {
        for(int i=1;i<=N;i++)//遍历第r行的所有列。 
        {
            a[r]=i;
            if(judge(r))
             hang(r+1);
        }
    }
}
int main()
{
  
   while(cin>>N&&N!=0)
   {
        ans=0;
        hang(1);
        cout<<ans<<endl;
   }
   return 0;
} 

i代表第几行,a[i]代表第几列,递推。

从第一行开始放,然后遍历每一列。同时还要检查一下之前的每行是否会和现在放的这个发生冲突。(不能在同一列,不能在对角线上)

这行的这列可以放,那么继续下一行。

 

注意这个问题用上述代码超时了,所以看一下范围,n小于等于10 ,所以采用打表的方式,算出来所有结果放在一个数组里面。

posted @ 2020-09-28 12:06  Tomorrow1126  阅读(122)  评论(0编辑  收藏  举报