01/10/2018, 17:35

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;
}
HK boy viết 19:40 ngày 01/10/2018

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 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

Nguyễn Xuân Hậu viết 19:45 ngày 01/10/2018

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

HK boy viết 19:49 ngày 01/10/2018

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

HK boy viết 19:40 ngày 01/10/2018

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ị);
Nguyễn Xuân Hậu viết 19:36 ngày 01/10/2018

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 ạ?

HK boy viết 19:39 ngày 01/10/2018

cinstd::cin thôi.

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

Nguyễn Xuân Hậu viết 19:45 ngày 01/10/2018

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

rogp10 viết 19:43 ngày 01/10/2018

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 đủ.

Bài liên quan
0