gpt4 book ai didi

c - 8 个皇后 "goto"命令困扰我

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

好吧,我已经为 8 个皇后问题编写了一个非常奇怪的代码。别问我是怎么走到这一步的。当我为第一个皇后设置一个好的位置时,代码成功计算了 8 个皇后的位置(对于 mat[k][l] 计算得很好,其中 k 为 5,l 为 0 起始位置)。之后,我尝试对程序进行修复,以便它能够在没有良好起始位置的情况下计算所有位置。所以想法是在整个代码之后计算皇后的数量,如果不是 8,则使用 goto 命令让代码返回到开头。在此之前我当然将第一个坐标增加了一个。所以思路是:从起始位置0, 0开始,如果代码完成后场上设置的皇后数量不是8,则增加k,回到开头,尝试从起始位置垫[1][0]。依此类推,直到找到正确的起始位置。但是,当我运行代码(在“改进”之后)时,它只是崩溃并且什么也不做。当我一开始将k设置为5,因此从mat[5][0]开始时,结果计算得很好。我认为问题出在 goto 命令上,我只是不知道如何修复它,因为我认为代码的想法很好。一些我似乎无法解决的技术问题。这是代码。

int main(int argc, char **argv)
{
int i, j, nul = 0, mat[8][8], tmpi, tmpj, a=0, k=0, l=0;
label3:
for (i=0; i<8; i++){
for(j=0; j<8; j++){
mat[i][j] = 0;
}
}

mat[k][l] = 1;
int n=0;
label1:
while( n < 64 ){
if ( n== 0){
for (i=0; i<8; i++){
for(j=0; j<8; j++){
if ( mat[i][j] == 1 ){
tmpi=i;
tmpj=j;
break;
}
}
}
for (i=0; i<8; i++){
for(j=0; j<8; j++){
if ( j == tmpj && i != tmpi ){
mat[i][j] = 2;
}
if( i == tmpi && j != tmpj ){
mat[i][j] = 2;
}
if ( i + j == tmpi + tmpj && ( i != tmpi && j != tmpj) ){
mat[i][j] = 2;
}
if ( i - j == tmpi - tmpj && ( i != tmpi && j != tmpj) ){
mat[i][j] = 2;
}
}
}
n++;
goto label1;
}

for (i=0; i<8; i++){
for(j=0; j<8; j++){
if ( mat[i][j] == 0){
mat[i][j] = 1;
tmpi = i;
tmpj = j;
goto label2;
}
}
}

label2:
for (i=0; i<8; i++){
for(j=0; j<8; j++){
if ( j == tmpj && i != tmpi ){
mat[i][j] = 2;
}
if( i == tmpi && j != tmpj ){
mat[i][j] = 2;
}
if ( i + j == tmpi + tmpj && ( i != tmpi && j != tmpj) ){
mat[i][j] = 2;
}
if ( i - j == tmpi - tmpj && ( i != tmpi && j != tmpj) ){
mat[i][j] = 2;
}
}
}
n++;
}
for (i=0; i<8; i++){
for(j=0; j<8; j++){
if ( mat[i][j] == 1){
a++;
}
}
}
if ( a!= 8 ){
k++;
goto label3;
}



for (i=0; i<8; i++){
for(j=0; j<8; j++){
if ( mat[i][j] == 2){
printf("%3d", nul);
}else printf("%3d", mat[i][j]);
}printf("\n");
}
system("pause");
return 0;
}

我知道发生了很多奇怪的事情。首先我将所有位置设置为 0,然后将一个位置设置为 1(这是皇后)。然后用2标记所有其他皇后不能放置的位置。然后我用其他皇后和其他2-s填补空白。然后只需将 2-s 打印为 0,当然将 1-s 打印为 1-s。还有很多奇怪的其他东西。 :) 重点是查找位置的代码运行良好,goto 只是让我头疼:)

最佳答案

声明:

goto label1;

相当于:

continue;

并将继续循环while( n < 64 )

声明:

goto label2;

正确使用goto :这是在不引入破坏代码的 bool 变量的情况下打破嵌套循环的唯一方法。

声明:

goto label3;

可以用 label3 处的循环替换直到if ( a!= 8 ) (删除 if):

for (k=0; a!=8; k++) {

用结构化代码替换 goto 后,您可能会更好地理解如何修复您的算法(我没有对此进行研究)。

关于c - 8 个皇后 "goto"命令困扰我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425694/

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