Hai đoạn code khác nhau chỗ nào?

Mọi người cho em hỏi hai đoạn code khác nhau chỗ nào ạ, đoạn 1 chạy được còn đoạn 2 thì không ạ. (In ra hoán vị của n chữ số đầu tiên)

#include<iostream>
using namespace std;

int a[10], dd[10]={0}, n;

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

void backtrack(int i){
	if(i>n) xuat();
	for(int j=1; j<=n; j++){
		if(dd[j]==0){
			dd[j]=1;
			a[i]=j;
			backtrack(i+1);
			dd[j]=0;
		}
	}
}

int main(){
	cin>>n;
	backtrack(1);
	return 0;
}

Đoạn 2:

#include<iostream>
using namespace std;
int a[10], dd[10]={1}, n;

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

void backtrack(int i){
	if(i>n) xuat();
	for(int j=1; j<=n; j++){
		if(dd[j]==1){
			dd[j]=0;
			a[i]=j;
			backtrack(i+1);
			dd[j]=1;
		}
	}
}

int main(){
	cin>>n;
	backtrack(1);
	return 0;
}

Theo đúng nghĩa khác nhau chỗ nào:

Tại sao khác? Vì 1 đoạn sẽ sai logic, 1 đoạn thì không :grin: 2 đoạn sai tuốt, tại compiler nên người code tưởng là 2 đoạn code này khác nhau, thực tế là không :grin:

3 Likes

Cụ thể là sao ạ? Em chưa hiểu lắm.

Dọn nội dung nhầm nhọt :frowning:

1 Like

2 code đều chạy được, có điều code 1 ra kết quả còn code 2 thì không.

Đáng ra 2 code này phải không chạy mới đúng. Mấu chốt nằm ở đoạn

dd[10]={0} // hay 1

Dòng này chỉ gán dd[0] bằng 1 giá trị bất kì thôi, còn những phần tử còn lại không được khởi tạo giá trị, giá trị của chúng sẽ là giá trị rác. Như vậy thì đoạn code if (dd[j] == ...) sẽ không hoạt động, vì có bao giờ dd[j] bằng được giá trị ở bên phải đâu :v

Kiểm chứng:

2 code (đã thêm đoạn in dd[]):

  • Code 1: https://ideone.com/vEU8e8 (ideone mặc định biến chưa khởi tạo có giá trị bằng 0, nhưng đổi sang 1 IDE khác sẽ cho kết quả toàn rác)

  • Code 2: https://ideone.com/JsmNsw (phần tử đầu tiên = 1, còn những phần tử còn lại không phải 1)


Để fill hết 1 giá trị, dùng std::fill.

Đối với mảng tĩnh:

std::fill(dd, dd + 10, giá_trị);
4 Likes

Dạ, em cảm ơn nhiều ạ. Cho em hỏi luôn ạ, trong mấy đoạn code nhiều khi em thấy có std::cin gì đó. Nó có gì khác với cin bình thường ạ?

cinstd::cin thôi.

http://www.cplusplus.com/reference/iostream/cin/

1 Like

Vậy là hai cái nó giống nhau ạ? Vậy thêm std:: vào với mục đích gì ạ?

Namespace là để cách ly mấy cái tên ra, nên mình using nguyên 1 namespace (thường là std!) là rất chuối. Vì vậy ta phải viết thêm tên namespace vào mới đầy đủ.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?