填空2题:与或异或
图中的每个三角形为:与、或、异或这三种运算中的一种,请问对于输入为{1,0,1,0,1}时,使得输出为1的三角运算符的组合有多少种?
思路:遍历每个三角,使其为与、或、异或的一种,遍历所有情况,最后求解输出是否为1,存在输出为1的情况答案就加一,累加起来就得到最后的答案。采用dfs,代码如下:
#include <bits/stdc++.h>
using namespace std;
vector<int> a{1,0,1,0,1};
vector<int> path;
int op(int a, int b, int sig){
int res = 0;
switch(sig){
case(0): res = a&b; break;
case(1): res = a|b; break;
case(2): res = a^b; break;
}
return res;
}
// s: 对于当前层第一个操作符的索引值
// length:当前层的符号个数
// path: 路径上的符号数组
// cur: 表示当前层每个元素的数组
int calc(int s, int length, vector<int> path, vector<int> cur)
{
if(length==-1)
return cur[0];
// 遍历当前层的符号,计算新的cur数组
for(int i=0; i<length; i++)
cur[i] = op(cur[i], cur[i+1], path[s+i]);
return calc(s+length, length-1, path, cur);
}
int dfs()
{
// 枚举的运算符个数已经满足题目要求了
if(path.size() == 10)
{
if(calc(0, 4, path, a)==1)
return 1;
return 0;
}
int res = 0;
for(int i=0; i<3; i++)
{
path.push_back(i);
res += dfs();
path.pop_back();
}
return res;
}
int main()
{
cout << dfs();
return 0;
}