블루 브릿지 컵 VIP 질문 알고리즘 문제를 훈련 배열

질문 알고리즘 문제를 훈련 준비

자원 제약
기한 : 1.0s 메모리 한계 : 512.0MB
문제 설명
  주어진 제약을 (즉, 각각의 숫자는 한번만 나타날 수)가 0 ~ N-1이 배치된다 (AN N * N 테이블을 추구 i 행 수가이 번호 I-1 후에 표시되지 않고, 소형 ~ 대형의 i 행 I 0)은 자연수로서 이러한 구성으로 시크되도록하여 0 또는 1의 j 번째 열, J-1로 표현되는 K 번째 순서.
데이터 크기 및 규칙
  N <= 10, K <= 500000
입력 포맷
  제 행동 및 N K 다음 N 열의 각 행 번호 N, 0이 아닌 나타내고, 1 캔 나타내는
출력 포맷
  장치가 필요한
입력을 샘플링
2. 3
0 1 1
. 0 0 1
0 0 1

샘플 출력

102
설명 :
어떤 제한없이 N = 3
, 012 : 제
둘째 021
번째 : 102
넷째 : 120
V 201
여섯째 21 0
이면 1 (2), 0 (2) 뒤에 표시 할 수 없기 때문에 표제 주어진 제약 나타나는 수
021 : 첫
번째 : 102
번째 : 210

생각 :이 질문은 가장 큰 어려움은 좋은 오름차순으로 정렬하는 방법입니다, 다음 선택은 간단하지만 오랜 시간 같은, 그래서 C ++ 아래에 체크 좋은 방법이없는 것은 특별한 종류이다 기능, 바로이 문제를 해결하는 데 사용할 수 있습니다. 우리는 처음에 의해 다음, 하나를 배열을 보존, 같은 번호가 무엇인지 숫자 뒤에 수없는 것을 같은 선별 매트릭스, 선출 된 제한을 받았다, 큰 시험에 큰에서 정렬 된 레코드를 자격의 수 녹화 된 프로그램은 K에서 종료되는 경우, 출력 할 수있는 타이틀의 수와 같다. (Next_permutation (a,이 분류를위한 + n의 함수)의 수 N-1에 배치 될 수 있고, 물론, 알고리즘을 공유 할 수있다이 문제로 자신의 용액을 설계 할 수있는 경우)

다음과 같이 코드입니다 :

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[15],c[100][2],i,j,k,sum=0,n,m,i1=0,l,l1=0;
	cin >> n >> m;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			cin >> k;
			if(i!=j && k==0){
				c[i1][0]=i;
				c[i1][1]=j;
				i1++;
			}
		}
	}
	for(i=0;i<n;i++){
		a[i]=i;
	}
	do{
		for(k=0;k<n-1;k++){
			for(l=0;l<i1;l++){
				if(a[k]==c[l][0] && a[k+1]==c[l][1]){
					l1=1;
					break;
				}
			}
			if(l1==1){
				break;
			}
		}
		if(l1==1){
			l1=0;
			continue;
		}
		else{
			sum++;
		}
		if(sum==m){
			for(i=0;i<n;i++){
				cout<<a[i]<<" ";
			}
			break;
		}
	}while(next_permutation(a,a+n));
	return 0;
}
게시 51 개 원래 기사 · 원 찬양 47 · 전망 2011

추천

출처blog.csdn.net/weixin_45269353/article/details/104522811