2013-12-18 191 views
-1

我一直在試圖調試我編寫的代碼,它只在數組的第一行輸出1,而其他所有元素都是零(從第二行到最後一個元素),是不是問題函數調用通過值或別的東西傳遞數組。幫助讚賞。8Queen代碼不起作用

#include<stdio.h> 
#include<stdlib.h> 

int isSafe(int x, int y, int a[][8]) 
{ int i,j; 

//for left check of the cols 
for(i=0;i<y;i++) 
{ 
if(a[x][i]==1) 
return 0; 
} 

    //for check of left upper diagonals 
    for (i = x, j = y; i >= 0 && j >= 0; i--, j--) 
    { 
    if(a[i][j]==1) 
    return 0; 
    } 

    //for check of left lower diagonals 
    for(i = x, j = y; i<=7 && j>=0; i++,j--) 
    { 
     if(a[i][j]==1) 
     return 0; 
    } 

return 1; 
}//close isSafe 

int EQueen(int a[][8], int q) 
{ 
int c=0; 
    if(q==8) 
    return 1; 

    else 
    { 
    while(c<=7) 
    { 
    if(isSafe(q,c,a)==1) 
    { 
    a[c][q] = 1; 
     if(EQueen(a,q+1)==1) 
     return 1; 

     else 
     a[c][q] = 0; 

    }//close if 

    c++;   
    }//close while 
    return 0; 

    }//close else 


}//close EQueen 

int main() 
{ 
int i,j,chess[8][8] = {[0 ... 7][0 ... 7] = 0}; 



if(EQueen(chess,0)==1) 
{ 

for(i=0;i<8;i++) 
{ 
    for(j=0;j<8;j++) 
    printf("%d ",chess[i][j]); 

    printf("\n"); 
} 
} 

return 0; 
}//close main 

回答

1

我相信這是因爲你的c變量沒有遞增。這是由於您如何遞歸調用您的EQueen函數。

if(q==8) 
return 1; 

當您的問與答變量等於8,即明確要求EQueen的該函數調用將返回1。在那之後,所有EQueen的前面函數調用後會有真正的if語句,因爲他們將全部回溯並返回值1並退出該函數調用的實例。

if(EQueen(a,q+1)==1) 
    return 1; 
else ... 

這就讓你isSafe功能僅着眼於第0行(C = 0),因爲之前它在你的C變量不增加檢查2×2維數組內的所有空間,由於EQueen退出函數循環。

2

你的原則是好的。你只需要小心地使用相同的索引行和列整個。您使用chess[row][col]打印板的方式。

選擇一致命名爲x,i,c等,您將看到在檢查電路板時,您的索引編制錯誤。將呼叫更改爲IsSafe

if (isSafe(c, q, a) == 1) ... 

它會工作。

(順便說一句,該數組是通過引用傳遞,從而反映所做的更改,沒有問題就在這裏。)

+0

如果我改變了語句[C] [Q]對[Q] [C ]並且保持函數調用相同,它將每行的第一個元素輸出爲1.雖然我想的方式是正確的。現在缺乏的地方在哪裏? – Sahir

+0

明白了,我並沒有檢查isSafe中女王範圍內的所有8個位置。 – Sahir