질문 알고리즘 문제를 훈련 준비
자원 제약
기한 : 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;
}