2012-09-08 105 views
0

我寫了一個程序爲8皇后problem.It打印所有可能的解決方案。不尋常的概率(8個皇后概率)

皇后()查找所有可能的解決方案。 ok()指示給定的列和行是否安全。

非常奇怪的問題是:

'計數'不會增加。我不知道爲什麼。

#include<iostream.h> 
#include<stdlib.h> 
#include<conio.h> 

int arr[8][8]={0}; 
int count=0; 

int ok(int k,int j) 
{ 
int i,l; 
int tup[8]={0}; 

for(i=0;i<k;i++) 
{ 
    for(l=0;l<8;l++) 
    { 
    if(arr[i][l]==1) 
    tup[i]=l; 
    } 
} 

for(i=0;i<k;i++) 
{ 
    if((abs(tup[i]-j)==abs(i-k))||(tup[i]==j)||(arr[i][j]==1)) 
    return 0; 
} 

return 1; 

} 


void queen(int i) 
{ 
int j,k,temp; 

if(i==8) 
{ 
    count++; 
    cout<<"Solution no. "<<count<<":\n"; 

    for(i=0;i<8;i++) 
    { 
    for(j=0;j<8;j++) 
    { 
    if(arr[i][j]==1) 
    cout<<"Q"; 
    else 
    cout<<"="; 
    cout<<" "; 
    } 
    cout<<"\n"; 
    } 
    cout<<"---------------\n"; 

    getch(); 

} 

for(j=0;j<8;j++) 
{ 
    if(ok(i,j)) 
    { 
    for(k=0;k<8;k++) 
    arr[i][k]=0; 
    arr[i][j]=1; 
    queen(i+1); 
    } 
} 

arr[i][j]=0; 

} 



int main() 
{ 

clrscr();  

queen(0); 

return 0; 

} 
+0

你介意顯示輸出? – slartibartfast

+0

您是否嘗試過使用調試器來遍歷代碼? – Oktalist

回答

3

您應該從queen功能i==8部分返回後完成。目前您繼續,並在年底你i==7j==8執行arr[i][j]=0;。這是一個超過陣列的末尾,並且countarr後立即駐留在內存中,它將被重置爲零。

使用gdb實測:增加計數的數量,設置(硬件)觀察點後休息,並繼續看到計再次改變數值。

+0

非常感謝。完美的答案。 – Nitishok