dfs经典n皇后:

思路:

Sel[i]第i行的横坐标,y本行的横坐标,x:本行的纵坐标,i:第n行

  1. 一行,一行的放元素,dfs接受行数(h),如果h>n,则开始走下一条路
  2. 核心是找横坐标(y),因为纵坐标已经确定,横坐标要满足:不与第i行在同一列(sel[i]!=y),不于第i处于同一对角线(abs(y-sel[i])==abs(x-i))
  3. 如果不满足,先跳出子循环(break),再continue父循环

N皇后问题打表 (cxb520.cn)

 

#include<bits/stdc++.h>
using namespace std;
long long sel[100];
long long n,sum;
long long ans[100];
void dfs(long long h)
{
    if(h>n)
    {
        sum++;
        return;//判断完一次后回到上一层
    }
    int x=h,y,i;
    for(y=1;y<=n;y++)
    {
        for(i=1;i<x;i++)
        {
            if(sel[i]==y)
            break;
        }
        if(i<x)
        continue;
        for(i=1;i<x;i++)
        {
            //对角线,abs(第i行的横坐标-本行的横坐标) ==abs(第i行的纵坐标-本行的纵坐标)
 if(abs(y-sel[i])==abs(x-i))
break;
        }
        if(i<x)
        continue;
        sel[i]=y;//目的!!!这才是目的!!!找到横坐标放进sel,没有这个其他的都白干 
        dfs(h+1);//!!!递归是dfs思想的核心!!
        //return; // 不需要记住当前状态,只是找数量,不需要回溯 
    }
}
int main()
{
    for(n=1;n<=10;n++)
    {
        sum=0;
        dfs(1);
        ans[n]=sum;
    }
    while(cin>>n)
    {
        if(n==0)
        break;
        cout<<ans[n]<<endl;;
    }
}

 

八皇后:

P1219 [USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<bits/stdc++.h>
using namespace std;
long long a[101],b[101],c[101],d[101];
long long n,sum;
void dfs(long long h)
{
    if(h>n)
    {
        sum++;
        if(sum<=3)
        {
            for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
            cout<<endl;
        }
        return;
    }
    int x=h,y,i;
    for(y=1;y<=n;y++)
    {
        if(b[y]==0&&c[x+y]==0&&d[x-y+n]==0)
        {
            a[x]=y;
            b[y]=1;
            c[x+y]=1;
            d[x-y+n]=1;
            dfs(h+1);
            b[y]=0;
            c[x+y]=0;
            d[x-y+n]=0;
        }
    }
}
int main()
{
    sum=0;
    cin>>n;
    dfs(1);
    cout<<sum<<endl;
    return 0;
}

简单的对以前在word中的算法笔记进行整理,自用,参考标注不完整,侵删

 

posted @ 2022-04-03 20:56  格蕾  阅读(26)  评论(0)    收藏  举报