http://oj.ecustacm.cn/problem.php?id=1301
全部全排列
记得排除重复的。4x3x2x1=24。
所以最后的结果要除以24.
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int a[8]={1,2,3,4,5,6,7,8};
int main(void)
{
int n=0;
ll sum1,sum2;
do
{
bool flag1=false;
bool flag2=false;
bool flag3=false;
bool flag4=false;
sum1=pow(a[0]*10+a[1],2)+pow(a[2]*10+a[3],2)+pow(a[4]*10+a[5],2)+pow(a[6]*10+a[7],2);
sum2=pow(a[0]+a[1]*10,2)+pow(a[2]+a[3]*10,2)+pow(a[4]+a[5]*10,2)+pow(a[6]+a[7]*10,2);
if(a[0]==8||a[2]==8||a[4]==8||a[6]==8)//判断位置对不对
flag1=true;
if(a[0]==5||a[2]==5||a[4]==5||a[6]==5)
flag2=true;
if(a[0]==3||a[2]==3||a[4]==3||a[6]==3)
flag3=true;
if(a[0]==2||a[2]==2||a[4]==2||a[6]==2)
flag4=true;
if(flag1&&flag2&&flag3&&flag4)
{
if(sum1==sum2)
{
n++;
}
}
}while(next_permutation(a,a+8));
printf("%d\n",n/24);
return 0;
}
简单写法:
你经过思考会发现。只需一个袋子排列,另一个袋子不变就可以了。
这样就自动排除重复的了。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[4]={2,3,5,8};
int b[4]={1,4,6,7};
int x,y,ans=0;
do
{
int a1=a[0]*10+b[0],b1=b[0]*10+a[0];
int a2=a[1]*10+b[1],b2=b[1]*10+a[1];
int a3=a[2]*10+b[2],b3=b[2]*10+a[2];
int a4=a[3]*10+b[3],b4=b[3]*10+a[3];
x=a1*a1+a2*a2+a3*a3+a4*a4;
y=b1*b1+b2*b2+b3*b3+b4*b4;
if(x==y)
ans++;
}while(next_permutation(a,a+4));
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int a[4]={2,3,5,8};
int ans;
int main(void)
{
do
{
int sum1=pow(a[0]*10+1,2)+pow(a[1]*10+4,2)+pow(a[2]*10+6,2)+pow(a[3]*10+7,2);
int sum2=pow(a[0]+10*1,2)+pow(a[1]+10*4,2)+pow(a[2]+10*6,2)+pow(a[3]+10*7,2);
if(sum1==sum2) ans++;
}while(next_permutation(a,a+4));
cout<<ans<<endl;
return 0;
}
最简单的写法:
题目里是有隐藏的彩蛋的。
题目给了信息,随便排列都可以。
说明从一个袋子里取和另一个袋子匹配的 任意一个组合都是正确的。
2第一个选可以2号袋子里的4个任意匹配 4种情况。
3第二个选可以2号袋子里的3个任意匹配 3种情况。(因为上一步已经取了1个)
5第三个选可以2号袋子里的2个任意匹配 2种情况。
8第四个选可以2号袋子里的1个任意匹配 1种情况。
那么答案 就是 4x3x2x1。
所以直接得结果24。