2011-11-12 06:46:36Morris

a274. 友誼的數字

a274. 友誼的數字

內容 :

你相信數字之間也是有友誼存在嗎?

不管你信不信,反正我是信了


你想要讓他們乖乖的排成一個橫列,但是顯然他們不太聽話,會活蹦亂跳

在你仔細觀察之後你發現一個現象,最左邊的那個數字就像班長一樣身負重責大任

一指定了就也不會再動了,左邊第二個,他覺得站在班長旁邊於有榮焉,

所以也很安分的站著。


接著,剩下的就麻煩了,他們都會覺得站在他們左邊的人

必須有足夠的能力能夠領導他們,他們才會安分,而且還要很合他們的個性

所以在你嘗試多次之後發現,這些數字會希望左邊兩位數字的 "和" 或者 "乘積"

是他們的倍數,這樣他們才會安分的站著
你的任務就是給定 N 個數字後,幫他們找到適當的位置排好 

輸入說明 :

多組輸入,以EOF作為結束
每組第一行為一個正整數 N ,第二行會有 N 個數字 Ai

1 <= N  <= 10
1 <= Ai <= 10,000,000

輸出說明 :

輸出一個符合題目要求的數列,如果有多組解,輸出字典序最小的數列
無解請輸出 No

範例輸入 :

5
1 1 1 1 1
4
5 3 3 2
3
5 7 9

範例輸出 :

1 1 1 1 1 
2 3 5 3 
5 9 7

提示 :

出處 :

(管理:VacationClub)



做法 : DFS

/**********************************************************************************/
/*  Problem: a274 "友誼的數字" from                                          */
/*  Language: C (915 Bytes)                                                       */
/*  Result: AC(4ms, 312KB) judge by this@ZeroJudge                                */
/*  Author: morris1028 at 2011-11-11 11:42:29                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *i, const void *j) {
    return *(long long *)i - *(long long *)j;
}
long long A[11], Way[11];
int flag, Used[11], N;
void DFS(int idx, int n) {
    int i;
    long long x, y;
    if(n == 0)    {
        for(i = 0; i < idx; i++)
            printf("%lld ", Way[i]);
        puts("");
        flag = 1;return;
    }    
    if(idx >= 2)    x = Way[idx-1]+Way[idx-2], y = Way[idx-1]*Way[idx-2];
    for(i = 0; i < N; i++) {
        if(!Used[i]) {
            if(idx < 2 || (idx >= 2 && (x%A[i] == 0 || y%A[i] == 0))) {
                Used[i] = 1;
                Way[idx] = A[i];
                DFS(idx+1, n-1);
                Used[i] = 0;
            }
            if(flag)    return;
        }
    }
}
int main() {
    int i, j;
    while(scanf("%d", &N) == 1) {
        for(i = 0; i < N; i++)
            scanf("%lld", &A[i]);
        qsort(A, N, sizeof(long long), cmp);
        memset(Used, 0, sizeof(Used));
        flag = 0, DFS(0, N);
        if(!flag)
            puts("No");
    }
    return 0;
}