2016第七屆藍橋杯國賽-大學A組 隨意組合(dfs)
阿新 • • 發佈:2019-01-07
描述
小明被綁架到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;
}