Untitled
unknown
plain_text
2 years ago
2.1 kB
3
Indexable
#include<iostream> using namespace std; int score[8][8]; // cách nhận biết một bài backtrack đó là kích thước ma trận nhỏ, thường là <20 int quanHau[8]; // luu cot cua quan hau int tc, n, maxScore; void reset(){ for( int i = 0; i < 8; i++){ quanHau[i] = 0; } maxScore = 0; } bool check(int row, int col){ for ( int k = 0; k < row; k++){ if ( quanHau [k] == col ) return false; // vị trí này đã đặt quân hậu if ( row - k == quanHau[k] - col ) return false; // kiểm tra theo hàng dọc và chéo if ( row - k == col - quanHau[k] ) return false; } return true; } void eightQueen(int index){ if( index == 8 ){ // với một bài backtrack cơ bản, ta luôn phải có điều kiện dừng int Score = 0; // đồng thời với một số bài tối ưu, ta còn cần điều kiện cắt nhánh for( int k = 0; k < 8; k++){ Score += score[k][quanHau[k]]; } if ( Score > maxScore ) maxScore = Score; } else{ for( int j = 0 ; j < 8; j++){ if( check(index , j) ){ // chắc chắn 8 quân hậu sẽ đặt ở 8 hàng nên ta sử dụng index vừa là số quân hậu vừa là hàng quanHau[index] = j; eightQueen(index + 1); // bình thường một bài backtrack sẽ còn có reset các biến, tuy nhiên bài này chưa cần. ta chạy tất cả trường hợp } } } } int main(){ //freopen("input.txt", "r", stdin); int count = 1; int T; cin >> T; for( tc = 1; tc <= T; tc++){ cout << "Case #" << tc << endl; cin >> n; for( int sobang = 0; sobang < n; sobang++){ //reset reset(); for( int i = 0; i < 8; i++){ for( int j = 0; j < 8; j++){ cin >> score[i][j]; } } //function eightQueen(0); //output cout << maxScore << endl; } } return 0; }
Editor is loading...