[白俊]#1821秀たちの和
17071 ワード
質問する
一番上の列には1からNまでの数字が書いてあります.そして、2行目からパスカルの三角形のように、上の2つを加算した値が格納されます.たとえば、Nが4で、一番上の行が3 1 2 4の場合、次の三角形が描画されます.
3 1 2 4
4 3 6
7 9
16
Nと一番下の数字が与えられた場合、一番上の行の数字を求めるプログラムを作成してください.しかし、答えがいろいろある場合は、一番前のものを辞書順に印刷します.入力
第1行は2つの整数N(1≦N≦10)とFを与える.Nは最上行数の個数を表し、Fは最下行数100000以下である.
しゅつりょく
最初の行では、三角形の一番上のN個の数字をスペースで区切って出力します.答えが存在しなければ入力できません.
入力例1
4 16
サンプル出力1
3 1 2 4
に答える
この問題はnext置換アルゴリズムを用いてすべての数の配列を求め,dfs(深さ優先探索)アルゴリズムを用いて最下位数を求め,入力と比較して答えを求める.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static int[] arr;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]);
int F = Integer.parseInt(input[1]);
arr = new int[N];
for(int i=1; i<=N; i++)
arr[i-1] = i;
if(F==sol(arr)) {
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" ");
}
return ;
}
while(next_permutation()) {
if(F==sol(arr)) { //마지막 수가 일치하는 경우 수 배열 출력
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" ");
}
return ;
}
}
}
public static int sol(int[] temp) {
if(temp.length==2) { //마지막 수 리턴
return temp[0]+temp[1];
}
if(temp.length==1) //입력이 1 1 인 경우
return 1;
int[] next = new int[temp.length-1];
int i = 0;
int j = 1;
while(j<temp.length) {
next[i] = temp[i]+temp[j];
i++;
j++;
}
return sol(next);
}
public static boolean next_permutation() {
int i = arr.length-1;
while(i>0 && arr[i]<=arr[i-1]) {
i--;
}
if(i<=0) return false;
int j = arr.length-1;
while(arr[i-1]>=arr[j])
j--;
int temp = arr[j];
arr[j] = arr[i-1];
arr[i-1] = temp;
j = arr.length-1;
while(i<j) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
i++;
j--;
}
return true;
}
}
Reference
この問題について([白俊]#1821秀たちの和), 我々は、より多くの情報をここで見つけました https://velog.io/@pss407/백준1821-수들의-합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol