题目的思路很简单。10个逻辑门,每个逻辑门有与、或、异或三种选项,在这10个逻辑门的所有排列中(共 3^{10}=59049种),问有多少种排列的最后计算结果是1。
#include<bits/stdc++.h>
using namespace std;
int a[5][5]={{1,0,1,0,1}}; //记录图中圆圈内的值,并初始化第1行
int gate[11]; //记录10个逻辑门的一种排列
int ans; //答案
int logic(int x, int y, int op){ //逻辑操作:c=1:与; c=2:或; c=3:异或
if(op == 1) return x & y; //与
if(op == 2) return x | y; //或
return x ^ y; //异或
}
int check(){ //检查10个逻辑门的排列,最后out是否为1
int op = 0;
for(int i = 1; i <= 4; i++) //从上到下有4行逻辑门
for(int j = 0; j <= 4 - i; j++) //每一行从左到右
a[i][j] = logic(a[i-1][j], a[i-1][j+1], gate[op++]);
if(a[4][0]) return 1; //out=1,结果正确
return 0;
}
void dfs(int k){ //第k个逻辑门
if(k == 10){ //一共有10个逻辑门,现在都分配好了。下面模拟这一种组合方式
if(check()) ans++; //out=1,结果正确
return;
}
for(int i = 1; i <= 3; i++){ //第k个逻辑门有三种选择:与、或、异或
gate[k] = i; //记录第k个逻辑门:与、或、异或
dfs(k + 1); //继续深搜第k+1个逻辑门
}
}
int main(){
dfs(0);
cout<<ans;
return 0;
}