n皇后问题描述_启发式算法解决N皇后问题

n皇后问题描述_启发式算法解决N皇后问题在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。SampleInput

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

Sample Input

1
8
5
0

Sample Output

1
92
10

很经典的n皇后问题。

第一个我放的代码是很经典而又简练的代码,但是放在vj上是超时,但是依然是通过回溯法做出来的

个人认为很巧妙

首先,进去函数后进行dfs对n皇后的竖坐标进行挨个位置枚举,x【i】=j也就是对坐标的标记,即第i行的竖坐标为j,然后对i ,j判断这个位置的可行性,枚举之间的已经确定好的数据即x[0]到x[i-1]所以的竖坐标值都不相同,且不再同一斜线,即相对应的的x的差值和相对应的的y的差值不同(斜线问题,仔细思考,也就是

abs(k-i)==abs(x[i]-x[k])很重要

)如果ij可能,进入下一行进行枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define maxx 12
using namespace std;

int sum=0,n;
int x[maxx];

int judge(int k)//判断x[k]列k行是否合理
{
    int i;
    for(i=1;i<k;i++)
    {
        if(x[i]==x[k]||abs(k-i)==abs(x[i]-x[k]))
        {
            return 0;
        }
    }
    return 1;
}

int queen(int t)
{
    if(t>n)//合适+1(可行解)
        sum++;
    else
    {
        for(int i=1;i<=n;i++)
        {
            x[t]=i;//t行i列
            if(judge(t))
            {
                queen(t+1);
            }
        }
    }
    return sum;
}

int main()
{
    int t;
    while(~scanf("%d",&n))
    {
        memset(x,0,sizeof(x));
        sum=0;
        if(n==0)
            break;
        else
            t=queen(1);
        printf("%d\n",t);
    }
    return 0;
}

后来发现就是要把数据存入数组就可以解决超时问题,要注意,数据较小时,把数据答案存入数组,时间会减少不少
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int book[15];
int cnt;

int judge(int k)
{
    int i;
    for(i=1;i<k;i++)
    {
        if(book[i]==book[k]||abs(i-k)==abs(book[i]-book[k]))
        {
            return 0;
        }
    }
    return 1;
}

void dfs(int k,int n)
{
    if(k>n)
    {
        cnt++;
    }
    else
    {
        for(int i=1;i<=n;i++)
        {
            book[k]=i;
            if(judge(k))
            {
                dfs(k+1,n);
            }
        }
    }
}

int main()
{
    int ans[12],t;
    for(int i=1;i<=10;i++)
    {
        memset(book,0,sizeof(book));
        cnt=0;
        dfs(1,i);
        ans[i]=cnt;
    }
    while(~scanf("%d",&t))
    {
        if(t==0)
            break;
        else
        {
            printf("%d\n",ans[t]);
        }
    }
    return 0;
}

第二种方法,简单的dfs,标记较多但是时间复杂度比较小
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int book_x[15],book_y[15],book_z[15];
int count;
int judge(int i,int step)
{
    int k;
    for(k=step-1;k>=1;k--)
    {
        if(book_y[k]==i+step)
            return 0;
        if(book_z[k]==i-step)
            return 0;
    }
    book_y[step]=i+step;
    book_z[step]=i-step;
    return 1;
}
void dfs(int step,int sum)
{
    int i;
    if(step==sum+1)
    {
        count++;
        return;
    }
    for(i=1;i<=sum;i++)
    {
        if(book_x[i]==0&&judge(i,step)==1)
        {
            book_x[i]=1;
            dfs(step+1,sum);
            book_x[i]=0;
        }
    }
}
int main()
{
    int ans[15];
    int i,n;
    for(i=1;i<=10;i++)
    {
        count=0;
        memset(book_x,0,sizeof(book_x));
        memset(book_y,0,sizeof(book_y));
        memset(book_z,0,sizeof(book_z));
        dfs(1,i);
        ans[i]=count;
    }
    while(~scanf("%d",&n))
    {
        if(n==0)
            break;
        printf("%d\n",ans[n]);
    }
    return 0;
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187743.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简述SQL2008部署多实例集群(学习)

    简述SQL2008部署多实例集群(学习)

    2021年11月26日
    70
  • vue混合app开发框架_mpvue框架

    vue混合app开发框架_mpvue框架1.npm安装npminstallflyio–save.2.src下新建utils/request.js文件importFlyfrom’flyio/dist/npm/wx’constfly=newFly()consthost=’https://rmall.ukelink.net’//添加请求拦截器fly.interceptors.request.use…

    2022年9月8日
    3
  • 修改python的pip源为国内源[通俗易懂]

    修改python的pip源为国内源[通俗易懂]由于网络原因,访问国外的pip源超级慢,因此可将源改为国内源(都是pipy官网的镜像),就能体验到流的飞起的速度了可临时修改,也可永久修改临时修改:在后边加个-i参数指定pip源,如下所示:pipinstallpackage_name-ihttps://pypi.tuna.tsinghua.edu.cn/simple永久修改:需要修改配置文件Windows:进入%…

    2022年5月4日
    41
  • 国内不用备案的cdn_2018年广电总局电影备案查询

    国内不用备案的cdn_2018年广电总局电影备案查询随着行业老大哥百度云加速的CDN关闭,不,不能说是关闭,是不再面向国外用户(实则是不再面向未备案中国用户),喜欢简单而快捷方式的草根大佬们不知道该何去何从,特别是用习惯了CDN的大佬,更是讨厌裸奔的感觉,没了层CDN,还真就觉得不安全了!事实上,CDN确实让我们的网站加速了不少,当然,排除那些劣质的CDN,有人可能会感觉不用CDN自己的网站反而会快很多,这个是错误的认知,你的网站访问不大的…

    2022年9月10日
    2
  • 移除word文档的域代码 remove all field codes of word[通俗易懂]

    移除word文档的域代码 remove all field codes of word[通俗易懂]去除word中因使用mendeley或endnote等文献管理软件而产生的域代码。网上很多说使用CTRL+SHIFT+F9,但亲测不行,可能是软件版本问题。使用以下方法解决:CTRL+A全选文章;CTRL+6去除全文域代码。参考:https://community.endnote.com/t5/EndNote-Styles-Filters-and/Removing-field-codes-adjusts-spacing-in-Word-document/td-p/152892http

    2022年6月10日
    141
  • springboot启动不了也不报错的解决方案「建议收藏」

    springboot启动不了也不报错的解决方案「建议收藏」公司用的springboot,随着项目的不断庞大,经常会出现一些稀奇古怪的问题,其实多半是配置文件有问题,但是没有错误提示信息,就很是难受,无从下手,以下列举一些自己遇到的常见的问题处理办法:案例1.项目启动,控制台只打印了SPRING的日志,然后自动停止,如截图所示:这种什么错误信息都没有,也是醉了,其实遇到这种情况,可以把启动方法trycatch起来即可在控制台显示错误信息…

    2022年9月7日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号