題目
小明被綁架到X星球的巫師W那里嵌牺。
其時(shí),W正在玩弄兩組數(shù)據(jù)(2 3 5 8)
和 (1 4 6 7)
他命令小明從一組數(shù)據(jù)中分別取數(shù)與另一組中的數(shù)配對龄糊,共配成4對(組中的每個(gè)數(shù)必被用到)逆粹。
小明的配法是:{(8,7),(5,6),(3,4),(2,1)}
巫師凝視片刻,突然說這個(gè)配法太棒了炫惩!
因?yàn)椋?br> 每個(gè)配對中的數(shù)字組成兩位數(shù)僻弹,求平方和,無論正倒他嚷,居然相等:
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
巫師頓時(shí)凌亂了退敦。。蚣抗。侈百。。
請你計(jì)算一下翰铡,包括上邊給出的兩種配法钝域,巫師的兩組數(shù)據(jù)一共有多少種配對方案具有該特征。
配對方案計(jì)數(shù)時(shí)锭魔,不考慮配對的出現(xiàn)次序例证。
就是說:
{(8,7),(5,6),(3,4),(2,1)}
與
{(5,6),(8,7),(3,4),(2,1)}
是同一種方案。
注意:需要提交的是一個(gè)整數(shù)迷捧,不要填寫任何多余內(nèi)容(比如战虏,解釋說明文字等)
思路分析
先取得全部不重復(fù)組合,再計(jì)算正和倒的平方和党涕,如果相等,計(jì)數(shù)變量自增巡社。
取得全部不重復(fù)組合
自己想了好久膛堤,發(fā)現(xiàn)各種代碼實(shí)現(xiàn)不如枚舉來得簡單……反正只有24個(gè)……
由圖一易知當(dāng)?shù)谝唤M為
(2,1)
時(shí),共有6種情況晌该,而第一組共有4種可能肥荔,所以總共有6x4=24
種可能。所以可以定義一個(gè)三維維數(shù)組:
int all[24][4][2]={{{2,1},{3,4},{5,6},{8,7}},
{{2,1},{3,4},{5,7},{8,6}},
{{2,1},{3,6},{5,4},{8,7}},
{{2,1},{3,6},{5,7},{8,4}},
{{2,1},{3,7},{5,4},{8,6}},
{{2,1},{3,7},{5,6},{8,4}},
{{2,4},{3,1},{5,6},{8,7}},
{{2,4},{3,1},{5,7},{8,6}},
{{2,4},{3,6},{5,1},{8,7}},
{{2,4},{3,6},{5,7},{8,1}},
{{2,4},{3,7},{5,1},{8,6}},
{{2,4},{3,7},{5,6},{8,1}},
{{2,6},{3,1},{5,4},{8,7}},
{{2,6},{3,1},{5,7},{8,4}},
{{2,6},{3,4},{5,1},{8,7}},
{{2,6},{3,4},{5,7},{8,1}},
{{2,6},{3,7},{5,1},{8,4}},
{{2,6},{3,7},{5,4},{8,1}},
{{2,7},{3,1},{5,4},{8,6}},
{{2,7},{3,1},{5,6},{8,4}},
{{2,7},{3,4},{5,1},{8,6}},
{{2,7},{3,4},{5,6},{8,1}},
{{2,7},{3,6},{5,1},{8,4}},
{{2,7},{3,6},{5,4},{8,1}}};
另外朝群,我只是一個(gè)C語言初學(xué)者燕耿,如果您有一個(gè)合適的取全部不重復(fù)組合的算法,請務(wù)必聯(lián)系我姜胖,謝謝誉帅!
(下面是我想算法時(shí)的一些內(nèi)容,因?yàn)椴恢雷约褐笫欠衲芟氲礁玫乃惴ㄓ依常詻]有刪掉蚜锨,而是選擇用刪除線勾掉,請您跳過閱讀)
自上而下思考:
2與其他一組的四個(gè)數(shù)字有四種組合方式慢蜓,分別為(2,1) (2,4) (2,6) (2,7)
當(dāng)?shù)谝唤M確定下來是(2,1)后亚再,3與另一組的三個(gè)數(shù)字有三種組合方式,分別為(3,4) (3,6) (3,7)
當(dāng)?shù)诙M確定下來是(3,4)后晨抡,5與另一組的兩個(gè)數(shù)字有兩種組合方式氛悬,分別為(5,6) (5,7)
當(dāng)?shù)谌M確定下來是(5,6)后则剃,8與另一組的剩下的一個(gè)數(shù)字就只有一種組合方式,是(8,7)
而當(dāng)?shù)谌M確定下來是(5,7)后如捅,8與另一組的剩下的一個(gè)數(shù)字就只有一種組合方式棍现,是(8,6)
定義結(jié)構(gòu)體儲(chǔ)存數(shù)據(jù)如下:
struct data{
int first[2];
int second[2];
int third[2];
int fourth[2];
};
~~一個(gè)結(jié)構(gòu)體存儲(chǔ)一組數(shù)據(jù),如組合方式:(2,1) (3,4) (5,6) (8,7)用結(jié)構(gòu)體數(shù)組即為:
~~
xxx.first[0]=2;
xxx.first[1]=1;
xxx.second[0]=3;
xxx.second[1]=4;
xxx.third[0]=5;
xxx.third[1]=6;
xxx.fourth[0]=8;
xxx.fourth[1]=7;
取得全部不重復(fù)組合算法:
由圖一易知當(dāng)?shù)谝唤M為(2,1)
時(shí)伪朽,共有6種情況轴咱,而第一組共有4種可能,所以總共有6x4=24
種可能烈涮。所以定義全部可能為一個(gè)結(jié)構(gòu)體數(shù)組朴肺,數(shù)組長度為24:
struct data all[24];
計(jì)算正和倒的平方和
int cnt=0;
for(int i=0;i<24;i++){
int sum1=0,sum2=0;
for(int j=0;j<4;j++){
sum1+=pow(all[i][j][0]*10+all[i][j][1],2);
}
for(int j=0;j<4;j++){
sum2+=pow(all[i][j][1]*10+all[i][j][0],2);
}
if(sum1==sum2){
cnt++;
}
}
完整代碼
#include <stdio.h>
#include <math.h>
int main(){
int all[24][4][2]={{{2,1},{3,4},{5,6},{8,7}},
{{2,1},{3,4},{5,7},{8,6}},
{{2,1},{3,6},{5,4},{8,7}},
{{2,1},{3,6},{5,7},{8,4}},
{{2,1},{3,7},{5,4},{8,6}},
{{2,1},{3,7},{5,6},{8,4}},
{{2,4},{3,1},{5,6},{8,7}},
{{2,4},{3,1},{5,7},{8,6}},
{{2,4},{3,6},{5,1},{8,7}},
{{2,4},{3,6},{5,7},{8,1}},
{{2,4},{3,7},{5,1},{8,6}},
{{2,4},{3,7},{5,6},{8,1}},
{{2,6},{3,1},{5,4},{8,7}},
{{2,6},{3,1},{5,7},{8,4}},
{{2,6},{3,4},{5,1},{8,7}},
{{2,6},{3,4},{5,7},{8,1}},
{{2,6},{3,7},{5,1},{8,4}},
{{2,6},{3,7},{5,4},{8,1}},
{{2,7},{3,1},{5,4},{8,6}},
{{2,7},{3,1},{5,6},{8,4}},
{{2,7},{3,4},{5,1},{8,6}},
{{2,7},{3,4},{5,6},{8,1}},
{{2,7},{3,6},{5,1},{8,4}},
{{2,7},{3,6},{5,4},{8,1}}};
int cnt=0;
for(int i=0;i<24;i++){
int sum1=0,sum2=0;
for(int j=0;j<4;j++){
sum1+=pow(all[i][j][0]*10+all[i][j][1],2);
}
for(int j=0;j<4;j++){
sum2+=pow(all[i][j][1]*10+all[i][j][0],2);
}
if(sum1==sum2){
cnt++;
}
}
printf("%d",cnt);
return 0;
}
結(jié)果
24