1~n의 배열 생성 및 재집합 가능한 배열 생성

2411 단어
#include 
using namespace std;

void printPermutation(int n, int* A, int cur)
{
	if (cur == n) { //  
		for (int i = 0; i < n; i++) {
			printf("%d ", A[i]);
		}
		printf("
"); } else { for (int i = 1; i <= n; i++) { // A[cur] i int ok = 1; for (int j = 0; j < cur; j++) { if (A[j] == i) { ok = 0; // i A[0]~A[cur-1] , } } if (ok) { A[cur] = i; printPermutation(n, A, cur + 1); // } } } } int main() { int A[20]; printPermutation(5, A, 0); // 1~5 return 0; }

순환 변수 i는 현재 고찰된 A[cur]입니다.원소 i가 이미 사용되었는지 확인하기 위해 위의 프로그램은 표지 변수 ok를 사용했습니다. 초기 값은 1(진짜)이고 A[j]=i가 발견되면 0(가짜)로 바꿉니다.만약 최종 ok가 아직 1이 아니라면, i가 시퀀스에 나타나지 않았다는 것을 설명하고, 시퀀스 끝 (A [cur] = i) 에 추가한 후에 다시 호출합니다.
충분한 수조 A를 설명하고 printPermutation (n, A, 0) 을 호출하면 사전순으로 1 ~ n의 모든 배열을 출력할 수 있습니다.
만약 문제가 입력 그룹 p로 변하고 사전 순서대로 그룹 A 요소의 모든 배열을 출력한다면 코드를 수정해야 합니다.
#include 
#include 
#include 
using namespace std;

int P[100], A[100];

//  p 。 p 
void printPermutation(int n, int* P, int* A, int cur) {
	if (cur == n) {
		for (int i = 0; i < n; i++) printf("%d ", A[i]);
		printf("
"); } else for (int i = 0; i < n; i++) { if (!i || P[i] != P[i - 1]) { int c1 = 0, c2 = 0; for (int j = 0; j < cur; j++) { if (A[j] == P[i]) { c1++; } } for (int j = 0; j < n; j++) { if (P[i] == P[j]) { c2++; } } if (c1 < c2) { A[cur] = P[i]; printPermutation(n, P, A, cur + 1); } } } } int main() { int i, n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &P[i]); } sort(P, P + n); printPermutation(n, P, A, 0); return 0; }

마지막으로 STL의 라이브러리 함수next_permultation
#include 
#include 
#include 
using namespace std;

int main()
{
	int n, p[10];
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &p[i]);
	}
	sort(p, p + n); //  , p 
	do {
		for (int i = 0; i < n; i++) {
			printf("%d ", p[i]); //  p
		}
		printf("
"); } while (next_permutation(p, p + n)); // return 0; }
상술한 코드는 재집합 가능에도 적용된다.
다음으로 전송:https://www.cnblogs.com/zhangyaoqi/p/4591533.html

좋은 웹페이지 즐겨찾기