gpt4 book ai didi

c - C 中的八皇后在递归中不打印任何内容

转载 作者:行者123 更新时间:2023-11-30 20:40:02 25 4
gpt4 key购买 nike

我自己正在上 C 类(class)。当我运行我的代码时,没有发生任何事情(不打印任何内容),并且我找不到问题。我发现我的检查功能很笨拙,我该如何改进它,使其变得精简而简单?这是我的代码。

#include <stdio.h>

#define ON 1
#define OFF 0
#define SIZE 8

void initial(int (*table)[SIZE]);
void setqueen(int (*table)[SIZE], const int row);
int check(const int (*table)[SIZE], const int row, const int col);
void prtable(const int (*table)[SIZE]);

int main(void)
{
int table[SIZE][SIZE];
int row = 0;

initial(table);

setqueen(table, row);

return 0;
}

void initial(int (*table)[SIZE])
{
int row, col;

for (row = 0; row < SIZE; row++)
for (col = 0; col < SIZE; col++)
table[row][col] = OFF;
}
/*
place a queen(set value = 1) in the first column of the first row and
check there is no conflict. if there is a conflict, count and move to
next column. if there is conflict in every column(count = 8), return.
if there is no conflict, call it recursively. when it place all queens,
print the table.
*/
void setqueen(int (*table)[SIZE], const int row)
{
int c = 0;
int count = 0;

for ( ; c < SIZE; c++) {
table[row][c] = ON;
if (check(table, row, c) == ON) {
table[row][c] = OFF;
count++;
continue;
}
if (count == SIZE)
return;
if (row != SIZE - 1)
setqueen(table, row + 1);
else
prtable(table);
}
}

void prtable(const int (*table)[SIZE])
{
int row, col;

for (row = 0; row < SIZE; row++) {
for (col = 0; col < SIZE; col++)
printf("%2d", table[row][col]);
putchar('\n');
}
putchar('\n');
}

int check(const int (*table)[SIZE], const int row, const int col)
{
int r = 0;
int c = 0;

for (r = 0; r < SIZE; r++)
if (r != row && table[r][col] == ON)
return ON;
for (c = 0; c < SIZE; c++)
if (c != col && table[row][c] == ON)
return ON;
for (r = row + 1, c = col + 1;
(r >= 0 && r < SIZE) || (c >= 0 && c < SIZE);
r++, c++)
if (table[r][c] == ON)
return ON;
for (r = row + 1, c = col - 1;
(r >= 0 && r < SIZE) || (c >= 0 && c < SIZE);
r++, c--)
if (table[r][c] == ON)
return ON;
for (r = row - 1, c = col + 1;
(r >= 0 && r < SIZE) || (c >= 0 && c < SIZE);
r--, c++)
if (table[r][c] == ON)
return ON;
for (r = row - 1, c = col - 1;
(r >= 0 && r < SIZE) || (c >= 0 && c < SIZE);
r--, c--)
if (table[r][c] == ON)
return ON;

return OFF;
}

最佳答案

你没有像你期望的那样递归。
setqueen 调用 setqueen 尝试所有可能性,但如果失败,则尝试将皇后放置在 for(c) 的同一行上循环,这将会失败。
setqueen开头调用prtable来查看算法在做什么,你会看到:

 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
0 0 0 1 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

然后算法将尝试在第 5 行放置皇后,失败但不会尝试移动之前放置的皇后。
setqueen 还应该删除皇后 table[row][c] = OFF; 并在递归调用 setqueen 失败时移至下一个(因此它应该返回一个值)。

除此之外,在我看来 countc 是同一件事,您可以在 for 循环中初始化 c 而不是之前(更具可读性),在中添加注释检查每个 for 循环检查的内容(列、行……),并避免使用 ON 和 OFF 来检查返回值(不清楚这意味着什么)。

关于c - C 中的八皇后在递归中不打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24485922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com