1.原题不赘述
2.思路
2.1深度优先搜索:首先创建一个二维数组(arr)用来存放数据,经过观察发现,从上到下数据个数分别为5,4,3,2,1.因此,我们将初始数据放入arr的第五行,依次向下递归搜索,按照与、或、异或。遍历所有情况,并判断最后是否为1。
3.代码如下
#include <bits/stdc++.h>
using namespace std;
int arr[6][6] = {0};//用于存储数据
int cnt = 0;//用来保存最后符合条件的方法数量
void dfs(int start, int end) //start表示从第几个数开始,end表示到第几个数结束
{
if(end<=1 ) //最后只有一个数
if (arr[end][start] == 1) //判断最后这个数是否为1
cnt++;
else
return;
else
{
if(start<end) //如果数据超过2个表示他们还可以进行操作(& | ^)
{
arr[end - 1][start] = arr[end][start] & arr[end][start + 1]; //我们从第5行开始,因此下一次为第四行
dfs(start+1, end);//深优先搜索
arr[end - 1][start] = arr[end][start] | arr[end][start + 1];//同上
dfs(start+1, end);
arr[end - 1][start] = arr[end][start] ^ arr[end][start + 1];//同上
dfs(start+1, end);
}
else //表示这一行已经全部完成可以进行下一行操作
dfs(1, end-1);//下一行比上一行少一个数
}
}
int main()
{
arr[5][0] = 0, arr[5][1] = 1, arr[5][2] = 0, arr[5][3] = 1, arr[5][4] = 0, arr[5][5] = 1;//初始化
dfs(1, 5);//从第一个数到第五个数(1 0 1 0 1)
cout << cnt << endl;
return 0;
}