Discuz! Board

 找回密码
 立即注册
查看: 373|回复: 0

八皇后4

[复制链接]

574

主题

758

帖子

243万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2435189

烈空座 Lv:100
发表于 2023-6-18 19:41:26 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <bits/stdc++.h>
using namespace std;
//m数组长度10就够了,总共8*8格 
int a[10][10]={0},m[100]={0};//a[10]使用状态  m[10]排列组合
int sum=0;
int t=0;
void print()
{
        printf("%d.\n",++t);
        for (int i=1;i<=8;i++)
        {
                for (int j=1;j<=8;j++)
                        printf("%d ",a[j][i]);//a[i][j],a[j][i]其实也没什么问题,就是行列反了 
                printf("\n");
        }
        printf("\n");
}
//check函数参数可变更为(int x,int y)
//避免使用到m[x],因为check后才决定是否要将y赋值给m[x] 
bool check(int x)
{
        for (int i = 1; i < x; i++)
        if (m[x] == m[i] || abs(m[i] - m[x]) == x - i)return false;
        return true;
}
void dfs(int x)
{
        //结果输出放在这里不太合适,虽然结果是对的
        //放在这里结果输出后还会继续向下运行
        //在check函数中判定x[9]数据不能使用停止,不如放在下面 
        if (x>=9)print();
        for (int y=1;y<=8;y++)
        {
                //在x行y列放一枚棋子,该位置在下次循环中会被覆盖,
                //所以不回溯也没什么影响,但最好放在if语句里
                //满足可放置棋子条件时再放置 ,而不是先放置再判断
                //是不是为了check函数要用到m[x]值,所以才才提前赋值?可以在check函数中增加y参数以解决 
                m[x]=y;
                if (a[x][y]!=1&&check(x))
                {
                        a[x][y]=1;
                        //这里缺少一段,棋子布满时输出结果,你的结果输出函数print放在了程序开头部分,不太合适
                        //if(x==8) print();
                        //else dfs(x+1);
                        dfs(x+1);
                        a[x][y]=0;
                }
        }        
}


void bahuanghou()
{
        dfs(1);
}
int main()
{
        bahuanghou();
        return 0;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-2-13 05:34 , Processed in 0.050374 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表