폭력 구해법의 매거 배열

2515 단어
1. 1 ~ n 배열 생성
#include<stdio.h>
#include<string.h>
const int N=1e3+10;
int a[N];
void print_permutation(int n,int *a,int cur)
{
    int i,j;
    if(cur==n) /* */
    {
        for(i=0;i<n;i++)
           printf("%d ",a[i]);
        printf("
"); } else { for(i=1;i<=n;i++) /* a[cur] i*/ { int ok=1; for(j=0;j<cur;j++) if(a[j]==i) /* i a[0]~a[cur-1] , */ { ok=0; break; } if(ok) { a[cur]=i; print_permutation(n,a,cur+1); /* */ } } } } int main() { int n; while(~scanf("%d",&n)) print_permutation(n,a,0); return 0; }

2. 재집합 가능한 배열 생성
위에서 배열을 구하는 프로그램은 임의의 두 원소가 모두 같지 않은 서열에만 적용되며, 원소가 같은 서열의 배열을 요구할 경우 위의 프로그램을 수정해야 한다.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int a[N],p[N];
void print_permutation(int n,int *p,int *a,int cur)
{
    int i,j;
    if(cur==n)
    {
        for(i=0;i<n;i++)
          printf("%d ",a[i]);
        printf("
"); } else { for(i=0;i<n;i++) if(p[i]!=p[i-1]) { int c1=0,c2=0; for(j=0;j<cur;j++) if(a[j]==p[i]) c1++; for(j=0;j<n;j++) if(p[i]==p[j]) c2++; if(c1<c2) { a[cur]=p[i]; print_permutation(n,p,a,cur+1); } } } } int main() { int n,i; while(~scanf("%d",&n)) { for(i=0;i<n;i++) scanf("%d",&p[i]); sort(p,p+n); print_permutation(n,p,a,0); } return 0; }

3. 다음 배열 구하기
모든 배열을 매거하는 또 다른 방법은 사전 서열의 가장 작은 배열부터'다음 배열 구하기'과정을 끊임없이 호출하는 것이다.어떻게 다음 배열을 구합니까?C++의 STL에 라이브러리 함수 next_permutation.
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int n,i,p[10];
	while(~scanf("%d",&n))
	{
		for(i=0;i<n;i++)
			scanf("%d",&p[i]);
	    sort(p,p+n); /* , p */
	    do
		{
			for(i=0;i<n;i++)
				printf("%d ",p[i]); /* p*/
		    printf("
"); }while(next_permutation(p,p+n)); /* */ } return 0; }

좋은 웹페이지 즐겨찾기