zoukankan      html  css  js  c++  java
  • 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 ,所以采用打表的方式,算出来所有结果放在一个数组里面。

  • 相关阅读:
    Git中使用.gitignore忽略文件的推送
    git stash详解
    Git撤销&回滚操作(git reset 和 get revert)
    git rebase和git merge的区别
    git撤销已经push到远程仓库上的代码
    Git Merge
    git cherry-pick 教程
    Failed to start LSB: Bring up/down错误解决方法
    linux centos7安装部署gitlab服务器
    CentOs7 HP找回root密码
  • 原文地址:https://www.cnblogs.com/h694879357/p/13744101.html
Copyright © 2011-2022 走看看