oj1059:火星(完全配列)

トピックス要件
人間のは、最終的には火星の土地に達し、神秘的な火星を見ました。人間と火星人はお互いの言語を理解することはできませんが、私たちの科学者は、デジタル通信の方法を発明しました。この交換方法は、まず、人間の科学者の非常に大きな数に火星人は科学者がこの番号の意味を壊す伝え、その後、上記に追加し、多数の非常に小さな数、結果は火星を伝える、つまり人間の答えとして。

指をスナップ - 数字を表現するための非常に単純な方法で火星。火星片手だけが、数十本の指の数千の唯一の手は、行の指は、1,2,3の番号が付けられている....... 火星の任意の二本の指が自由に彼らはこの方法でカウントされ、位置を交換することができます。

人間の手のショーでA火星はどのように指でカウントします。それらは通常の順に配置されたときに親指、人差し指、ミドル、リングと小指とき5桁12345、リングと少し交流を形成する、3、4と5の番号が付けられている - 5本の指がいる場合第二ピニオン12354;位置は、1を表し、5桁12354、すべての5桁120に形成された完全に逆転5本の指、54321の注文を置く際に形成することができ、最小12345を形成する場合、2を表す、最大54321、120を表します。以下の表に示す3本のだけ指と数字は、それらが表すときに形成することができる6 3桁。

三元数
123
132
213
231
312
321

数字が表す
。1
2
。3
。4
。5
。6

今、あなたは幸運十分には地球と火星の最初の人々は人々とコミュニケーションすることができます。A火星は、あなたが彼の指を見てみましょうし、科学者たちは一緒に非常に小さな数字を行くことを教えてくれます。あなたの仕事は、科学者火星の数が一緒にあなたの番号を教え、そしてまた、その結果に応じ火星の指の順序を変更するには、指で表現されます。結果は、火星の指の範囲を超えないことを確実にするために、入力データを表現することができます。
入力
入力は、最初の行は、N、指の数火星(1 <= N <= 10000の整数陽性を有し、三行を含みます )。二行目は、正の整数Mであり、リストに追加することは、小さな整数を表す(1 <= M <= 100 )。次の行は、火星は、指の順番を表し、N 1は、Nを整数に配置されたスペースで区切られています。
出力
Nの整数が含まれている唯一の出力ラインを、火星は、指の変更後の順序を示しています。スペースで区切られたすべての隣接する二つの中間の数字は、あなたは余分なスペースを持つことができません。
入力サンプル

。5
。3
。1 2 5 4 3
サンプル出力

。1つの2 5 4 3
完全な配列の知識に関連するトピックは、
ここについて話すには、一例で123、123、123がフルに配置されている、すべての簡単な構成を理解しています132,213,231,312,321は、3の合計です!= 6種。もしツリーは、ノードツリー、それぞれ、二つのノードとエンド・ノードとして123 123です。アカウントへのすべての状況、最初から深さ優先探索アルゴリズムDFSの最後を見つけます。

ここでみんなとの完全なアレイ法に固有のリンクについてのブログは、一緒に学ぶ:
https://www.cnblogs.com/sooner/p/3264882.html

int m,n;
int a[10010],vis[10010];//记录数字和当前位置
void DFS(int x)
{
  if(x==0)//x到0时开始输出
  {
    for(int i=0;i<n;i++)
      {
        if(i!=n-1)
        cout<<a[i]<<" ";
      else
        cout<<a[i]<<endl;
      }
      return ;
  }
  for(int i=1;i<=n;i++)
  {
    if(vis[i]==0)
      {
        a[n-x]=i;
        vis[i]=1;
        DFS(x-1);
        vis[i]=0;//记得清楚当前记录
      }
  }
int main()
{
    cin>>n;
    DFS(n);
    system("pause");
    return 0;
}

結果は以下の通りである
ここに画像を挿入説明
長い再び現在のデジタル完全なアレイM回の再配置などのように、全体配置が添加後に出力することができるため、被写体を。
* しかし、そこに単純なC ++関数の完全な配列であるnext_permutation(a, a + n);*
必要がアレイ状に配置され、+は、N配列の長さであり、完全導通するように構成された
完全なコードを

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[10005], n, m;
int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    while (m--)
        next_permutation(a, a + n);
    for (int i = 0; i < n - 1; i++)
        cout << a[i] << " ";
    cout << a[n - 1] << endl;
    return 0;
}
公開された38元の記事 ウォン称賛27 ビュー3176

おすすめ

転載: blog.csdn.net/qq_45891413/article/details/105055629
おすすめ