好的,所以我为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打印为零,将1-s打印为1-s。还有很多其他怪异的东西。 :)关键是找到位置的代码运行良好,goto只是让我头疼:)

最佳答案

该声明:

goto label1;


等效于:

continue;


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

该声明:

goto label2;


goto的正确用法:这是打破嵌套循环而又不引入会破坏代码的布尔变量的唯一方法。

该声明:

goto label3;


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

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


用结构化代码替换gotos之后,您可能会更好地了解如何解决您的算法(我没有研究过)。

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

10-11 00:08