八皇后问题介绍
八皇后问题是一个古老而著名的数学问题,最早由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
这个问题不仅是一个有趣的谜题,而且是计算机科学中回溯算法的一个经典案例。回溯算法通过逐步构建解决方案,并在发现冲突时回溯到之前的步骤,从而找到所有可能的解决方案。
在八皇后问题中,一种常见的解决方法是使用一个长度为8的数组来表示皇后的位置。数组的每个元素代表一列,其值表示该列上的皇后所在的行号。通过全排列的方式生成所有可能的列排列,并检查每种排列是否满足皇后不互相攻击的条件。
除了全排列解法外,还有其他一些优化方法可以提高求解八皇后问题的效率。例如,可以使用位运算来快速判断两个皇后是否在同一对角线上,或者使用递归和迭代的方法来减少循环次数。
八皇后问题不仅在数学和计算机科学领域具有重要地位,还经常被用作教学和测试算法复杂度的示例。此外,该问题还可以推广为更一般的n皇后摆放问题,即在n×n的棋盘上摆放n个皇后,使其不互相攻击。这个问题也有许多有趣的解法和应用。
大模型介绍
当前常见的大模型有文心一言、ChatGPT,以及开源的ChatGLM等,今天我们就以八皇后问题来考一下这三个大模型。让我们看看它们的表现吧!

我认为c语言对它们可能有点难,就先用lisp试试。
hy lisp代码
请用hy语言写八皇后问题解决的代码
(import itertools *)
(import toolz.itertoolz [first])
(defn solve-n-queens [n]
(defn is-valid [board row col]
(setv queens (map second board))
(and (not (in col queens))
(notany (fn [i] (= 0 (- col (nth queens i)) (- row i))))
(notany (fn [i] (= 0 (+ col (nth queens i)) (- row i))))))
(defn solve [board row]
(if (= row n)
(list board)
(let [cols (range n)]
(filter
(fn [col]
(is-valid board row col))
(map
(fn [col]
(solve (assoc board row col) (+ row 1)))
cols)))))
(first (solve {} 0)))
(print (solve-n-queens 8))
这个(import [itertools *]) 直接有报错,改写成(import itertools *)
报错:NameError: name ‘first’ is not defined ,发现可以先导入first:(import toolz.itertoolz [first])
报错: (solve (assoc board row col) (+ row 1)))
NameError: name ‘assoc’ is not defined 先搁置。
本来以为lisp代码是最简单的,但是问题多多,先搁置,看来要调整下阶段工作重心了。
chatgpt的c语言代码
chatgpt的这个c语言的pass
#include
#include
#define N 8
bool isSafe(int board[N][N], int row, int col) {
int i, j;
for (i = 0; i = 0 && j >= 0; i--, j--)
if (board[i][j])
return false;
for (i = row, j = col; j >= 0 && i = N)
return true;
for (int i = 0; i
文心一言3.5的c代码
文心一言的刚开始缺失了int j 声明而报错,加上之后,发现结果错误:
#include
#include
#define N 8
bool is_safe(int board[], int row, int col) {
int i;
int j;
// 检查列上是否有冲突
for (i = 0; i = 0 && j >= 0; i--, j--) {
if (board[i] == j)
return false;
}
// 检查右上方是否有冲突
for (i = row - 1, j = col + 1; i >= 0 && j = N) {
// 输出棋盘状态
for (int i = 0; i
运算结果:
./a.out
. . . . . . . Q
Q . . . . . . .
Q . . . . . . .
Q . . . . . . .
Q . . . . . . .
Q . . . . . . .
Q . . . . . . .
Q . . . . . . .
简单调了下,没有调通。先搁置。
ChatGLM3的c语言代码
刚开始给的代码:
#include
void print_board(int board[9][9]) {
for (int i = 0; i {0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}};
int n = 8;
solve(board, 0, n);
return 0;
}
不明白为什么这里用了9。文心一言说:这段代码的目标是解决九宫数独(Sudoku)问题,但实际上它试图解决的是8皇后问题(N Queens Problem),只是棋盘大小和变量命名有些混淆。数独和8皇后是两个不同的问题,但它们都涉及到在棋盘上放置一些“皇后”或“数字”以避免冲突。
重新问了它问题“再写一个八皇后的实现程序,用c ,注意,不是数独”,这回至少棋盘是对的了
改变了问题策略之后的c代码
#include
void print_board(int board[8][8]) {
for (int i = 0; i {0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}};
int n = 8;
solve(board, 0, n);
return 0;
}
拿着这段代码去问文心一言,它说:
这段八皇后问题的代码已经基本正确,但is_safe函数缺少了斜线方向的冲突检查。在八皇后问题中,我们需要确保新的皇后在放置时不会与任何其他皇后处于同一行、同一列或同一对角线上。
下面是修改后的is_safe函数,它现在包含了斜线方向的冲突检查:
int is_safe(int board[8][8], int row, int col) {
for (int i = 0; i = 0 && col - i >= 0 && board[row - i][col - i] == 1) {
return 0;
}
// 检查次对角线上是否有冲突
if (row - i >= 0 && col + i
将主次对角线的代码修改成文心这段代码,整个程序终于运行成功了!
经过文心一言修改后的完成代码
#include
void print_board(int board[8][8]) {
for (int i = 0; i = 0 && col - i >= 0 && board[row - i][col - i] == 1) {
return 0;
}
// 检查次对角线上是否有冲突
if (row - i >= 0 && col + i {0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}};
int n = 8;
solve(board, 0, n);
return 0;
}
输出显示:
gcc eightqueen_glm3.c
./a.out
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0
总结:
虽然很多代码生成并不能一次性成功,但是在多个大模型交叉调试的情况下,还是能满足我们的日常编程需求的。
调试
hy (import [itertools *]) 直接有报错
(import [itertools *])
Traceback (most recent call last):
File “stdin-0bab587d83cb82a8d732b16c55398dcca4b8b02b”, line 1
(import [itertools *])
^
hy.errors.HySyntaxError: parse error for pattern macro ‘import’: got unexpected token: hy.models.List([
hy.models.Symbol(‘itertools’),
hy.models.Symbol(‘*’)]), expected: end of input
直接写成(import itertools *)
hy报错:NameError: name ‘first’ is not defined
发现可以先导入first:(import toolz.itertoolz [first])
hy报错:NameError: name ‘assoc’ is not defined
(solve (assoc board row col) (+ row 1)))
NameError: name ‘assoc’ is not defined
先搁置。
文章来源于互联网:测试大模型八皇后求解ChatGPT、文心一言和ChatGLM3
相关推荐: 国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)
国内外大模型汇总 1. 科大讯飞星火认知大模型 主要特点: 多语言能力:以中文为核心,同时支持多语言处理,能够进行跨语种的语言理解和生成。 广泛的任务能力:具备内容生成、语言理解、知识问答、推理、数学计算、代码理解与生成等多种能力,能够处理复杂的自然语言任务。…
5bei.cn大模型教程网










