好的,所以我为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/