2016-04-03 30 views
0

Bir nxn boole dizisini alan bir işlevi tanımlayarak n-kraliçe problemini (nxn kartına nxn kartına neknesiz bir şekilde yerleştirerek) yanlışları çözmeye çalışıyorum ve cevabı doldurmalıyım Kraliçelerin olması gereken yer. Yanlış cevap alıyorum ama yinelemenin neden işe yaramadığını göremiyorum! Ana içindeN Queen özyinelemeli program

bool check(bool ** board, int n, int row, int col){ 
    if(row == 0) return true; 
    for(int r = 0 ; r < row ; ++r){ 
    if(board[r][col]) return false; 
    int left = max(col - row + r, 0), right = min(col + row - r, n-1); 
    if(board[r][left] || board[r][right]) return false; 
    } 
    return true; 
} 


bool queen(bool ** board, int n, int level = 0){ 
    for(int col = 0 ; col < n ; ++col){ 
    if(!check(board, n, level, col)) continue; 
    board[ level ][ col ] = true; 
    if(level == n-1) return true; 
    if(queen(board, n, level+1)) return true; 
    board[ level ][ col ] = false; 
    } 
    return false; 
}  

() i dinamik (n kurulu) kraliçe ** kurulu bool oluşturmak ve sahte ile doldurmak, sonra da diyoruz.

Garip olan şey n = 4,6 hariç doğru çözümü vermesidir!

Herhangi bir yardım büyük beğeni topluyor!

cevap

1

Hatanız min/max.Operation olduğundan, düz çizgileri kontrol etmiyorsunuz. Bu, hile yapmalıdır:

int left = col - row + r; 
int right = col + row - r; 

    if (left >= 0 && board[r][left] || right < n && board[r][right]) 
      return false; 
+0

bu gerçekten çalışıyor! ama min max ile sorunun ne olduğunu anlamıyorum, çünkü onlar sadece yönetim kurulu sınırlarını terk etmemek ve kurulu kenarına ulaştığınızda koşullu ifadeniz –

+0

aynı işi yapmak sütun: [1,3] ile başlayarak, [0,2], sonra [0,1] ve [0,0] kontrol edin. Thats demek istediğim düz çizgiler ... – Turo

+0

anlamlıdır, teşekkürler! –

İlgili konular