Chỉ em loại bớt trường hợp bị trùng trong bài sắp xếp n người vào 1 bàn

Em làm bài sắp xếp n người vào 1 bàn, em đã liệt kê được tất cả cách xếp rồi nhưng vẫn còn 1 cái là trường hợp xếp 1 người vào nhiều chỗ,đây là code của em

void xuathoanvi(nguoi b[],int n){
	for (int i=1;i<=n;i++)
		printf("%s ",b[i]);
	printf("\n");
}
void sapxep(nguoi a[],int n,int j,nguoi b[]){
	for (int i=1;i<=n;i++){
			b[j]=a[i];
			if (j==n) xuathoanvi(b,n);
			else sapxep(a,n,j+1,b);
	}
}

ai có cách nào để loại bớt thì chỉ cho em với

1 Like

Đọc đề của bạn mình nghĩ ngay đến phương án này :smile: nhưng mà hình như không ổn lắm, vì không nên dùng nhiều vòng for lồng nhau :stuck_out_tongue_closed_eyes: k biết có cách nào giải bài này mà k dùng công thức hoán vị không nhể :smile:

https://www.google.com/search?q=how+to+make+n+for+nested

À mà có được dùng đệ quy không :smile:

Mà trường hợp trùng nhau thì chỉ cần if (tất cả khác nhau) là được mà :smile: như ở cái link SO trên người ta cho được các counter vào 1 cái mảng counters, giờ chỉ cần cho tất cả các phần tử trong mảng đó khác nhau là được :smiley:

em dùng phương pháp quay lui đó anh (có đệ quy) :smile: để em thử cái if kia

1 Like

Mềnh cũng chẳng biết thuật toán mấy đâu :blush: bạn cứ ngâm cứu xem, không thì phải chờ các cao thủ vào trợ giúp :smile:

*97 nhá đồng chí :V

:dancer: tưởng lớn hơn cơ

1 Like

Code python :smile: thế này chắc đúng roài nhể :smiley:

1 Like

chính nó :smile_cat:

1 Like

Ha ha cuối cùng cũng làm ra bác à :smile: sau cả một buổi suy nghĩ :smile:

2 Likes

Ngon vậy :v share code đuê :v

OK code đây

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
struct nguoi {
	char hoten[40];
};
void nhapsonguoi(int &n) {
	do {
		printf("Nhap so nguoi: ");
		scanf("%d",&n);
	} while(n<=0);
}
void nhapDS(nguoi a[],int n) {
	fflush(stdin);
	for (int i=1; i<=n; i++) {
		printf("Nhap ho va ten nguoi thu %d: ",i);
		gets(a[i].hoten);
	}
}
void xuathoanvi(nguoi b[],int n) {
	for (int i=1; i<=n; i++)
		printf("%s\t",b[i]);
	printf("\n");
}
void sapxep(nguoi a[],int n,int j,nguoi b[],int c[]) {
	for (int i=1;i<=n;i++) 
		if (c[i]==1){
			b[j]=a[i];
			if (j==n) xuathoanvi(b,n);
			else {
				c[i]=0;
				sapxep(a,n,j+1,b,c);
				c[i]=1;
			}

	}
}
main() {
	nguoi ds[40],b[40];
	int n,k,c[40];
	nhapsonguoi(n);
	nhapDS(ds,n);
	for (int i=1;i<=n;i++)
		c[i]=1;
	sapxep(ds,n,1,b,c);
	getch();
}

tự làm nên khá dài :smile:

2 Likes
#include <iostream>
using namespace std;

string ten[100];
int soluong;
int vitri[100];
bool daco[100];

void nhap()
{
    cout<<"Nhap ten tren moi dong, nhap \"exit\" de thoat: "<<endl;
    for(soluong=1; ; soluong++)
    {
        cin>>ten[soluong];
        if(ten[soluong]=="exit") break;
        daco[soluong]=false;
    }
    soluong--;
}

void xuat()
{
    for(int i=1; i<=soluong; i++)
    {
        cout<<ten[vitri[i]]<<"; ";
    }
    cout<<endl;
}

void duyet(int i)
{
    for(int j=1; j<=soluong; j++)
    {
        if(!daco[j]) // nếu người thứ j chưa có trong dãy....
        {
            daco[j]=true; // đánh dấu là đã có rồi.
            vitri[i]=j;
            if(i==soluong) xuat();
            else duyet(i+1);
            daco[j]=false; // bỏ đánh dấu;
        }
    }
}

int main()
{
    nhap();
    duyet(1);
    return 0;
}
1 Like

giống với thuật toán của mình đã làm rồi :smile:

Có vẻ gọn gàng hơn???

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