1. 程式人生 > >2016第七屆藍橋杯國賽-大學A組 隨意組合(dfs)

2016第七屆藍橋杯國賽-大學A組 隨意組合(dfs)

描述

小明被綁架到X星球的巫師W那裡。

其時,W正在玩弄兩組資料 (2 3 5 8) 和 (1 4 6 7)
他命令小明從一組資料中分別取數與另一組中的數配對,共配成4對(組中的每個數必被用到)。
小明的配法是:{(8,7),(5,6),(3,4),(2,1)}

巫師凝視片刻,突然說這個配法太棒了!

因為: 每個配對中的數字組成兩位數,求平方和,無論正倒,居然相等: 87^2 + 56^2 + 34^2 + 21^2 = 12302
78^2 + 65^2 + 43^2 + 12^2 = 12302

小明想了想說:“這有什麼奇怪呢,我們地球人都知道,隨便配配也可以啊!” {(8,6),(5,4),(3,1),(2,7)}

86^2 + 54^2 + 31^2 + 27^2 = 12002 68^2 + 45^2 + 13^2 + 72^2 = 12002

巫師頓時凌亂了。。。。。

請你計算一下,包括上邊給出的兩種配法,巫師的兩組資料一共有多少種配對方案具有該特徵。 配對方案計數時,不考慮配對的出現次序。 就是說:
{(8,7),(5,6),(3,4),(2,1)} 與 {(5,6),(8,7),(3,4),(2,1)} 是同一種方案。

注意:需要提交的是一個整數,不要填寫任何多餘內容(比如,解釋說明文字等)

思路

直接列舉所有情況,dfs即可,最後答案為:24

程式碼

#include <bits/stdc++.h>
using namespace std;
int a[]= {2,3,5,8};
int b[]= {1,4,6,7};
int num[4][2],ans=0,vis[10];
void dfs(int r[][2],int d)
{
    if(d>=4)
    {
        int x=0,y=0;
        for(int i=0; i<4; i++)
        {
            x+=r[i][0]*r[i][0];
            y+=r[i][1]*r[i][1];
        }
        if
(x==y) { ans++; return; } } for(int i=0; i<4; i++) for(int j=0; j<4; j++) { if(!vis[i]) { r[i][0]=a[i]*10+b[j]; r[i][1]=b[i]*10+a[i]; vis[i]=1; dfs(r,d+1); vis[i]=0; } } } int main() { dfs(num,0); printf("%d\n",ans); return 0; }