ltx_zero

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

递归回溯八皇后复习

注意反向斜线不能使用abs,1和-1对应的是不一样的线

具体操作

  • 找边界,在边界停止回溯
  • 在判断可以走这一步后完成这一步标记,并进入下一循环
  • 下一循环结束以后(即函数表达式后面),把前面标记的东西改回来
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n;
int ans[100];
bool hashTable[100];
bool a[100];
bool b[100];
int countnum=0;
void bhh(int num)
{
    for(int x=1;x<=n;x++)
    if(hashTable[x]==false && a[x+num]==false && b[x-num+10]==false)
    {
        if(num==n)
        {
            countnum++;
            if(countnum<=3)
            {
            for(int i=1;i<=n-1;i++)
            {
                printf("%d ",ans[i]);
            }
            printf("%d\n",x);
            }
            return;
        }
        hashTable[x]=true;
        a[x+num]=true;
        b[x-num+10]=true;
        ans[num]=x;
        //cout<<"this part"<<endl;
        bhh(num+1);
        hashTable[x]=false;
        a[x+num]=false;
        b[x-num+10]=false;
    }
}
int main()
{
    scanf("%d",&n);
    memset(hashTable,0,sizeof(hashTable));
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    bhh(1);
    printf("%d\n",countnum);
    return 0;
}
View Code
posted on 2020-01-19 10:56  ltx_zero  阅读(114)  评论(0编辑  收藏  举报