鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] 通用解题思想:回溯法(附八皇后问题解析)

  [复制链接]
发表于 2020-2-25 18:46:54 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 21:25:17 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 11:54:45 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-28 17:28:00 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-3 15:00:44 | 显示全部楼层
签到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 11:29:41 | 显示全部楼层
12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 15:23:38 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 23:06:35 | 显示全部楼层
什么情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 10:03:44 | 显示全部楼层
真想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 16:01:35 | 显示全部楼层
真想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 21:43:05 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 10:41:38 | 显示全部楼层
.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-16 11:47:52 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 16:55:26 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 17:46:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-16 18:13:48 | 显示全部楼层
#include <stdio.h>

int count = 0;

int check(int i, int j, int (*queen)[8]);
void setQueen(int i, int (*queen)[8]);

int check(int i, int j, int (*queen)[8])
{
        int s, t;

        // 判断行
        for (s = i, t = 0; t < 8; t++)
        {
                if (queen[s][t] == 1 && t != j)
                {
                        return 0;
                }
        }

        // 判断列
        for (t = j, s = 0; s < 8; s++)
        {
                if (queen[s][t] == 1 && s != i)
                {
                        return 0;
                }
        }

        // 判断左上方
        for (s = i-1, t = j-1; s >= 0 && t >= 0; s--, t--)
        {
                if (queen[s][t] == 1)
                {
                        return 0;
                }
        }

        // 判断右上方
        for (s = i+1, t = j+1; s < 8 && t < 8; s++, t++)
        {
                if (queen[s][t] == 1)
                {
                        return 0;
                }
        }

        // 判断左下方
        for (s = i+1, t = j-1; s < 8 && t >= 0; s++, t--)
        {
                if (queen[s][t] == 1)
                {
                        return 0;
                }
        }

        // 判断右下方
        for (s = i+1, t = j+1; s < 8 && t < 8; s++, t++)
        {
                if (queen[s][t] == 1)
                {
                        return 0;
                }
        }

        // 经过上面层层关卡还能存活,那么说明符合条件,返回1
        return 1;
}

void setQueen(int col, int (*queen)[8])
{
        int i, j, row;

        // 所有皇后放置完毕
        if (col == 8)
        {
                for (i = 0; i < 8; i++)
                {
                        for (j = 0; j < 8; j++)
                        {
                                if (queen[i][j] != 0)
                                {
                                        printf("Q ");
                                }
                                else
                                {
                                        printf("* ");
                                }
                        }
                        putchar('\n');
                }

                putchar('\n');
                count++;

                return;
        }

        // 迭代每一行
        for (row = 0; row < 8; row++)
        {
                // 检查每一行中对应的每一列能否放置皇后
                if (check(row, col, queen))
                {
                        // 如果queen[row][col]符合条件,则放置皇后
                        queen[row][col] = 1;
                        // col+1,进入下一层递归
                        setQueen(col+1, queen);
                        // 只有两种情况会执行下面语句
                        // 1. col+1遇到所有的row都不合适
                        // 2. 完成整个二维数组的放置
                        // 无论哪种情况,
                        queen[row][col] = 0;
                }
        }
}

int main(void)
{
        int queen[8][8];
        int i, j;

        // 初始化二维数组,1表示已放置皇后,0表示没有
        for (i = 0; i < 8; i++)
        {
                for (j = 0; j < 8; j++)
                {
                        queen[i][j] = 0;
                }
        }

        setQueen(0, queen);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 23:12:25 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 15:25:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 15:43:43 | 显示全部楼层
正想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 11:09:32 | 显示全部楼层
朕想知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-9 06:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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