E mới học về phần quay lui, bài đầu tiên em học là về bài toán quân hậu.
Đặt n quân hậu vào bàn cờ n*n, sao cho chúng không tấn công nhau. Thầy e có lời giải như này:
struct hau{
int n, x[100], dem = 0;
map<int,bool> R, D, T;
void TRY(int k){
if(k == n){
cout << "\n" << ++dem << " : ";
for(int i = 1; i <= k; i++) cout << " " << x[i];
return;
}
for(int i = 1; i <= n; i++)
if(R[i] == 0 && D[k+1-i] == 0 && T[k+1+i] == 0){
R[i] = D[k+1-i] = T[k+1+i] = 1;
x[k+1] = i;
TRY(k+1);
R[i] = D[k+1-i] = T[k+1+i] = 0; //lui
}
}
void sol(){
cin >> n;
TRY(0);
}
};
int main()
{
hau H;
H.sol();
}
Mọi người có thể giải thích cho e cái đoạn
void TRY(int k){
if(k == n){
cout << "\n" << ++dem << " : ";
for(int i = 1; i <= k; i++) cout << " " << x[i];
return;
}
for(int i = 1; i <= n; i++)
if(R[i] == 0 && D[k+1-i] == 0 && T[k+1+i] == 0){
R[i] = D[k+1-i] = T[k+1+i] = 1;
x[k+1] = i;
TRY(k+1);
R[i] = D[k+1-i] = T[k+1+i] = 0; //lui
}
}
này hoạt động như nào với ah, e không hiểu lắm. E cảm ơn!