01/10/2018, 12:15

Cần giải thích cơ chế hoạt động của lệnh Try(i+1, n) trong code đệ quy quay lui

#include<iostream>
#include<cmath>
	// gia su co quan hau dat tai vi tri (x1,y1), ta muon dat them con hau ke tiep
	// tai vi tri (x2,y2), lam the nao ?
using namespace std;
int a[8] ; // luu vet chuong trinh

bool OK(int x2, int y2 ){ // k tra vi tri (x2, y2) co dat dc queen ?
	for(int i = 1; i< x2; i++ )
		//a[i] == y2 => columns are same
		//|i - x2| == |a[i] - y2| => in diagonals.
		if(a[i] == y2|| abs(i-x2) == abs(a[i] - y2) ) return false;
	return true;
}

void xuat(int n ){
	for(int i=1; i<= n; i++ )
        cout<<" " <<a[i];
	cout<< endl;
}

void Try(int i, int n ){
	for(int j = 1; j<= n; j++ )
		if(OK(i,j)) // queen tai vi tri hang i dat vao cot thu j
		{
			a[i] = j;
			if(i==n)
                xuat(n);
			Try(i+1,n);
		}
}

int main(){
	int n = 8;
	Try(1,n);
	return 0;
}

mn cho mình hỏi sao khi gọi hàm Try(i+1,n) thì nó in được như trong ảnh vậy.mình biết nó là quay lui nhưng vần không hiểu cơ chế của nó lắm.mn giải thích giúp mình được không ạ.
đây là bài 8 con hậu ạ.
thanks

all

HK boy viết 14:30 ngày 01/10/2018

Bạn tìm thuật toán 8 hậu trên google, hoặc học lại cơ bản về backtracking.

Hoàng Trung Hiếu viết 14:25 ngày 01/10/2018

bạn cài visual studio xong bật debug lên nhé

rogp10 viết 14:28 ngày 01/10/2018

Nên hiểu là tìm cấu hình đúng với yêu cầu. Lựa chọn ở bước này sẽ phụ thuộc vào những lựa chọn ở bước trước, chứ không đợi đến xong rồi mới thử (một số ít bài với dãy nhị phân có màn này).

Sau khi một hàm (callee) chạy thì nó rút stack và quay về hàm caller.

Kênh Giải Trí viết 14:24 ngày 01/10/2018

mình đã đọc backtracking nhưng thật sự là không hiểu nổi nên ms nhờ mọi nhười giải thích hộ ak.ai hiểu rõ giải thích hộ mình với

Kênh Giải Trí viết 14:18 ngày 01/10/2018

cho mình hỏi sao m sau khi debug trong hàm try.gọi tới hàm try(i+1,n)thì nó lại in được như trong ảnh vậy.mình thật sự đọc rất nhiều lần r nhưng vần không hiểu được.r sao m mình debug trong hàm try,nó chỉ chạy qua vòng for có đúng 1 lần nhưng nó lại có thể in được vậy.mình muốn hỏi 2 ý như thế thôi

rogp10 viết 14:15 ngày 01/10/2018

Mình để breakpoint vào dòng 2 của Try() thì nó vẫn chạy đủ i mà.

Kênh Giải Trí viết 14:18 ngày 01/10/2018

không lệnh for trong hàm Try() ak #rogp10

HK boy viết 14:25 ngày 01/10/2018

không lệnh for trong hàm Try()

Vòng for đó duyệt các ô (i, j) để tìm khả năng đặt con hậu ở hàng i.

Đọc lại về thuật toán N-hậu:

GeeksforGeeks – 21 Jul 11

N Queen Problem | Backtracking-3 - GeeksforGeeks

We have discussed Knight’s tour and Rat in a Maze problems in Set 1 and Set 2 respectively. Let us discuss N Queen as another… Read More »

Bài liên quan
0