C语言 八皇后(包含错误代码及分析)

news2025/1/16 8:18:03

基本思路:

用递归思想解决,在8*8的棋盘放置8个皇后,则放置成功会每行有且仅有一个皇后(因为皇后不能同行),所以可以循环行,尝试在某列放置,和 全排列 http://t.csdn.cn/kvIXC 的解决方法很类似,具体思路见代码。

正确代码:

#include <stdio.h>
#include <string.h>

int d[8]={0};//棋盘
int ins_2=0;
int num=0;

void print()
{
    for(int i=0;i<8;i++,printf("\n"))
    for(int j=0;j<8;j++)
    {
        if(d[i]!=j)printf("o ");
        else printf("* ");
    }
    printf("\n");
}

void core(int i)//i为当前行
{
    if(i==8&&ins_2==8)
    {
        print();
        num++;
        return ;
    }
    else if(i!=0)
    for(int j=0;j<8;j++)//j为当前列
    {
        int temp=0;
        for(int k=0;k<i;k++)
        {
            if(d[k]==j)//某列已经被使用
            {
                temp=1;
                break;
            }
            if(k-d[k]==i-j || k+d[k]==i+j)//斜线冲突
            {
                temp=1;
                break;
            }
        }
        if(temp==0)
        {
            d[i]=j;
            ins_2++;
            core(i+1);
            ins_2--;
        }
    }
    else if(i==0)
    {
        for(int j=0;j<8;j++)//第一行可以直接放置
        {
            d[0]=j;
            ins_2++;
            core(1);
            ins_2--;
        }
    }
}

int main()
{
    core(0);
    printf("共%d解\n",num);
    return 0;
}

代码分析:

做的是时候还是遇到很多问题,下面写一下自己遇到和解决的问题。

斜线判断:

if(k-d[k]==i-j || k+d[k]==i+j)

k-d[k]==i-j (横坐标减纵坐标)只解决了左上到右下方向的斜线,要解决左下到右上方向的斜线还需要 k+d[k]==i+j (横坐标加纵坐标)

特殊处理第core(0)状态:

core函数中对i==0的状态特殊处理了一下: else if(i==0) ,如果不特殊处理,core函数为:

void core(int i)//i为当前行
{
    if(i==8&&ins_2==8)
    {
        print();
        num++;
        return ;
    }

    for(int j=0;j<8;j++)//j为当前列
    {
        int temp=0;
        for(int k=0;k<i;k++)
        {
            if(d[k]==j)//某列已经被使用
            {
                temp=1;
                break;
            }
            if(k-d[k]==i-j || k+d[k]==i+j)//斜线冲突
            {
                temp=1;
                break;
            }
        }
        if(temp==0)
        {
            d[i]=j;
            ins_2++;
            core(i+1);
            ins_2--;
        }
    }
}

不特殊处理,则在i==0的状态进入第10行的for循环,在进入13行的循环,不满足k<i直接退出,结果就是啥也没干就结束程序(13行的for循环的作用是检查前面放置的皇后是否会使得当前位置不能再放置皇后,放置第一个皇后也不用检查啥,所以直接单独拿出来处理这种情况就很简单)。

错误分析:

这个是一开始写错的代码,不但结果是错的还会无止息的运行:

void core(int i)//i为当前行
{
    if(i==8&&ins_2==8)
    {
        print();
        return ;
    }
    else if(i!=0)
    for(int j=0;j<8;j++)//j为当前列
    {
        for(int k=0;k<i;k++)
        {
            if(d[k]==j)//某列已经被使用
                continue;
            if(k-d[k]==i-j ||  k+d[k]==i+j)//斜线冲突
                continue;
            d[i]=j;
            ins_2++;
            core(i+1);
            ins_2--;
        }
    }
    else if(i==0)
    {
        for(int j=0;j<8;j++)//第一行可以直接放置
        {
            d[0]=j;
            ins_2++;
            core(1);
            ins_2--;
        }
    }
}

几个状态的截图:

问题出在11到21行,我能想到的一个原因是这里只要当前行与之前某一行不存在冲突,则就会进入子问题继续处理,导致结果会是错的,为啥一直循环下去没想明白,循环到后面会多次打印一张图,感觉像是有穷的,不过没有测试,附几个循环到后面的运行图。

for(int k=0;k<i;k++)
{
if(d[k]==j)//某列已经被使用
continue;
if(k-d[k]==i-j || k+d[k]==i+j)//斜线冲突
continue;
d[i]=j;
ins_2++;
core(i+1);
ins_2--;
}

循环到后面的运行图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulnhub DC系列 DC-4

总结&#xff1a;爆破&#xff0c;teehee提权 目录 下载地址 漏洞分析 信息收集 密码爆破 命令执行 ​编辑 ssh爆破 提权 下载地址 DC-4.zip (Size: 617 MB)Download: http://www.five86.com/downloads/DC-4.zipDownload (Mirror): https://download.vulnhub.com/dc/D…

远程连接mysql报错:1130 - Host XXX is not allowed to connect to this MySQL server

问题描述 1130 - Host 123.120.193.96 is not allowed to connect to this MySQL server 译&#xff1a;不允许主机 123.120.193.96 连接到此 MySQL 服务器 远程连接的时候出现如下错误&#xff1a; 问题分析 根据描述提示&#xff0c;在用Navicat配置远程连接Mysql数据库时遇…

【Node.js】写一个数据自动整理成表格的脚本

前言 企业项目进行数据埋点后&#xff0c;埋点事件名需要整理成Excel表格便于统计&#xff0c;目标是将下图左侧数据转化成下图右侧的Excel表格&#xff1a; 考虑到左侧埋点数据是随项目迭代增加的&#xff0c;埋点数据每增加一次我就要把数据一条一条的CtrlC/V复制粘贴至Ex…

春节要放假了,外贸人你准备好了吗?

一转眼&#xff0c;老外们的假期即将结束&#xff0c;而我们的春节假期即将开启。有人会想&#xff1a;工作一年了&#xff0c;好不容易春节放个假&#xff0c;我是不是应该好好休息了&#xff1f;对别人是&#xff01;但是对于我们外贸人&#xff0c;并不是&#xff01;很多外…

第十三届蓝桥杯C++B组省赛 J 题——砍竹子(AC)

1.砍竹子 1.题目描述 这天&#xff0c;小明在砍竹子&#xff0c;他面前有 nnn 棵竹子排成一排&#xff0c;一开始第 iii棵竹子的高度为 hihihi。 他觉得一棵一棵砍太慢了&#xff0c;决定使用魔法来砍竹子。 魔法可以对连续的一段相同高度的竹子使用&#xff0c;假设这一段…

数学基本算法

欧几里得算法 求两个数的最大公约数&#xff1a; /**** param a 整数* param b 整数* return 两个整数的最大公约数*/public static int gcd(int a,int b){return b0?a:gcd(b,a%b);} 扩展欧几里得 /*** * param a * param b (a,b)两个整数* param x * param y (x,y)…

LeNet5模型与全连接模型的差异

1 问题深度学习训练过程中&#xff0c;有很多的训练模型&#xff0c;我们组就在思考LeNet模型与之前运用的全连接模型在训练精度损失与验证精度损失上有什么差别&#xff1f;2 方法这是LeNet模型的主要代码&#xff0c;对数据进行两成卷积与两次池化之后再建立三成全连接即可。…

Oracle数据库的监控指标

一、Oracle 监控指标 Oracle数据库常见性能指标主要有:当前登录数、非阻塞锁数、当前死锁数、阻塞锁数、当前锁数、会话数等内容,如下图所示。 注意:以下是 Oracle 监控所需要的指标,具体根据需要监控哪些、超阈值而定。 1.1 新建主机群组 1.2 新建模板 1.3 创建主机 …

Qt 6.4.2在Windows上安装过程及简单验证

Qt是一个跨平台的C开发库&#xff0c;用来开发图形用户界面(Graphical User Interface, GUI)。它支持Windows、Linux、macOS、Android、iOS、QNX等平台&#xff0c;一个框架、一套代码库、任意平台部署。Qt有开源和商业两种许可。 Qt从5.15开始官方不再直接提供开源的exe…

H5——连连看小游戏实现思路及源码

部门要求推广新产品用连连看小游戏的方式&#xff0c; 设计那边UI还没有排期&#xff0c;先撸个功能demo&#xff0c;正好记录一下&#xff1b; 连连看都玩过&#xff0c;程序的关键在于判断连续点击的两张图片是否能够消除&#xff0c;两个图片消除的条件有两个&#xff1a; …

【3 - 特征工程】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

Blog Navigation

Blog Navigation Linux Kernel 0x01_LinuxKernel_内核的启动&#xff08;一&#xff09;之启动前准备[2022-7-5]0x02_LinuxKernel_内核的启动&#xff08;二&#xff09;SMP多核处理器启动过程分析 [TODO]0x21_LinuxKernel_内核活动&#xff08;一&#xff09;之系统调用 [20…

【OpenGL学习】OpenGL窗口创建

OpenGL窗口创建 本节介绍如何在利用配置好的GLFW和GLAD进行一个简单窗口的绘制&#xff0c;首先明白在OpenGL中进行图形绘制到窗口的整个流程&#xff1a; 初始化GLFW创建窗口window创建OpenGL上下文初始化Glad渲染循环结束绘制 初始化GLFW 然后我们从上面的流程逐步进行窗…

知微传感3D相机SDK开发文档一查找相机

知微传感3D相机SDK开发文档一查找相机 主要对知微传感3D相机的SDK文件做一个介绍&#xff0c;大家一个界面显示程序包含图像的获得&#xff0c;相机的查找和链接 查找相机&#xff0c;通过UDP广播形式查找局域网相机链接相机&#xff0c;通过IP地址链接局域网内的相机获取图片&…

如何提升计算机的运行速度-正确清理C盘的方法

本文是向大家介绍清理C盘的方法&#xff0c;它能够实现给系统盘瘦身&#xff0c;能够带来提升计算机运行速度价值。提升计算机的运行速度-清理C盘的方法1 利用Windows附带的磁盘清理工具鼠标右击【C盘】选择【属性】选择【磁盘清理】勾选需要清理的文件&#xff0c;点击【确定】…

2023 hgame --- week1 wp

文章目录Miscsign ine99p1ant_want_girlfriend神秘的海报Where am IWebClassic Childhood GameBecome A MemberGuess Who I AmShow Me Your BeautyCryptoRSABe Stream神秘的电话兔兔的车票Retest_your_IDAeasyasmencodeeasyenca_cup_of_teaPwntest_nciotHelp the uncle who can…

【阶段三】Python机器学习29篇:机器学习项目实战:DBSCAN算法的基本原理与DBCSAN新闻聚类分群模型

本篇的思维导图: DBSCAN模型 DBSCAN(全称为Density-Based Spatial Clustering of Applications with Noise)是一种以密度为基础的空间聚类算法,可以用密度的概念剔除不属于任一类别的噪声点。该算法将簇定义为密度相连的点的最大集合,将具有足够密度的区域划分为…

rabbitmq命令大全

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录服务管理启动服务后台启动查看状态用户管理新增账号删除用户所有用户:修改密码:清除密码角色管理设…

MinIO安装总结

概述 初学者安装MinIO还是会遇到很多坑的&#xff0c;这里做个总结&#xff0c;希望能够大家可以快速的搭建MinIO环境&#xff0c;可以更好的快速入门。 linux下手动安装(不推荐) cd /opt/testMinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x…

spark Shuffle

Spark Shuffle的演进及SortShuffle的基本思想 1. 演进 HashShuffle -> HashShuffle 的Consolidate机制 -> SortBasedShuffle -> Tungsten-sort Based Shuffle 2. 各种 Shuffle的介绍 2.1 HashShuffle Spark 之所以一开始就提供基于 Hash 的 Shuffle 实现机制&…