全排列问题,没什么好说的,主要是用了剪枝优化 , 对于前面的条件就不符合的排列,没有必要往下排了 , 所以直接return跳出函数就行了
#include<iostream> #include<cstring> #include<algorithm> using namespace std ; int a[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13} ; int b[20]; bool v[20] ; int ans = 0; void dfs(int u ){ if(u == 12) {//满了就输出 if(b[9] * b[11] == b[10]) ans++ ; else return ; } if(u == 3 && b[0] + b[1] != b[2]) return ;//剪枝,进行优化 if(u == 6 && b[3] - b[4] != b[5]) return ; if(u == 9 && b[6] * b[7] != b[8]) return ; for(int i = 0 ; i < 13 ; i ++){//1-13 开始遍历 if(!v[i]){ v[i] = true ; b[u] = a[i] ; dfs(u + 1) ; v[i] = false ; } } } int main(){ dfs(0) ; cout << ans << endl; return 0 ; }