2016A06寒假作业 全排列

 又是一个全排列哈,

注意注意,这个题不是十三个数字都需要,但原理是一样的

一开始把for的边界写错了(每次其实应该从k开始,还没看出来orz)

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <time.h>
#include <algorithm>
//全排列,但需要剪枝
using namespace std;
int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans=0;
int check(){
    if((a[1]+a[2]==a[3])&&(a[4]-a[5]==a[6])&&(a[7]*a[8]==a[9])&&
    (a[10]%a[11]==0)&&(a[10]/a[11]==a[12]))
        return true;
    return false;
}

void f(int k){
    if(k==14 ){
        if(check()) {
            ans++;
        }
    }
    for (int i = k; i <= 13; ++i) {
        int t = a[i];
        a[i] = a[k];
        a[k] = t;
        if(k==3&&(a[1]+a[2]!=a[3])){//可以多剪几次枝
            int t = a[i];
            a[i] = a[k];
            a[k] = t;
            continue;
        }
        f(k + 1);
        int q = a[i];
        a[i] = a[k];
        a[k] = q;
    }
}
int main(){
    f(1);
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/zhmlzhml/p/13386617.html