質問は、学習アルゴリズムの問題を手配します
リソース制約
制限時間:1.0秒メモリ制限:512.0メガバイトの
問題が記載
0〜N-1が配置されているシーク(すなわち、各数値は一度だけ現れることができる)、与えられた制約(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
1 0 0
0 0 1
サンプル出力
102
説明:
のいずれかの限定されないが、N = 3
012:第
二:021
サード:102
四:120
V:201
シックス:21 0
バック1 2、0 2の背後に表示されない可能性があるための制約条件指定されたタイトルが表示されることができない
021:第
二:102
三:210
思考:この質問は、最大の難しさである、その後の選択は簡単ですが、良いの昇順にソートする方法ですが、長い時間のように良い方法はありませんので、チェックC ++の下で見つかったの特別なものです機能、直接この問題を解決するために使用することができます。我々は最初のもので、その後、1を配列に保存し、そのような数はどのような数字の後ろにはできませんどのようにスクリーニングマトリックス、選出された制限を、与えられた、大規模なテストに大きなからソートされたレコードを予選の数録画番組がKにおいて終了すると、出力することができ、タイトルの数に等しいです。(アルゴリズムが共有することがあり、この問題のうち、独自のソリューションを設計することができる場合Next_permutation + nの(関数)このソートするため、1-Nの数は、当然のことながら、配置されていてもよいです)
コードは以下の通りであります:
#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;
}