30/09/2018, 19:00

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("
");
}
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

Thành Phạm viết 21:15 ngày 30/09/2018

Đọc đề của bạn mình nghĩ ngay đến phương án này 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 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ể

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

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

stackoverflow.com
Rumpelstiltskin

How to make n nested for loops recursively?

java, recursion
asked by Rumpelstiltskin on 02:35PM - 16 Oct 13

Mà trường hợp trùng nhau thì chỉ cần if (tất cả khác nhau) là được mà 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

17XGOD viết 21:16 ngày 30/09/2018

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

Thành Phạm viết 21:04 ngày 30/09/2018

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

*97 nhá đồng chí :V

17XGOD viết 21:06 ngày 30/09/2018

ồ tưởng lớn hơn cơ

Thành Phạm viết 21:15 ngày 30/09/2018

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

17XGOD viết 21:12 ngày 30/09/2018

chính nó

17XGOD viết 21:11 ngày 30/09/2018

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

Thành Phạm viết 21:15 ngày 30/09/2018

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

17XGOD viết 21:13 ngày 30/09/2018

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

hacked viết 21:05 ngày 30/09/2018
#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;
}
giaosudauto.blogspot.com

giaosudauto

Giaosudauto Hacker Blogger

17XGOD viết 21:10 ngày 30/09/2018

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

hacked viết 21:16 ngày 30/09/2018

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

Bài liên quan
0