题目链接:https://www.lanqiao.cn/problems/3552/learning/?subject_code=1&group_code=6&match_num=14&match_flow=1&origin=cup
笔记:
2025.4.9
1.不会做,看题解,找了一个题解,思路:用数组描述递归过程,遍历所有可能值,当满足递归结束条件时退出,当结果是1时,增加计数
2.尝试复现,复现成功
理解点:
数组的范围:x+y==3时,开始换行,不往后
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | enter | 0 |
1 | √ | √ | enter | √ | |
2 | √ | enter | √ | ||
3 | enter | √ | |||
4 | finish |
题解:
#include <iostream>
using namespace std;
int a[7][7];
//4 3 2 1
int ans;
void dfs(int x,int y){
if(x==4&&y==0){
if(a[x][y]==1)++ans;
return;
}
//与
a[x+1][y]=a[x][y]&a[x][y+1];
if(x+y==3)dfs(x+1,0);//完成换行
else dfs(x,y+1);//向右发展
//或
a[x+1][y]=a[x][y]|a[x][y+1];
if(x+y==3)dfs(x+1,0);
else dfs(x,y+1);
//异或
a[x+1][y]=a[x][y]^a[x][y+1];
if(x+y==3)dfs(x+1,0);
else dfs(x,y+1);
}
int main()
{
a[0][0]=1;
a[0][1]=0;
a[0][2]=1;
a[0][3]=0;
a[0][4]=1;
dfs(0,0);
cout<<ans;
return 0;
}
第一版代码(Accepted)
#include <iostream>
using namespace std;
int a[5][5]={1,0,1,0,1};
int ans=0;
void dfs(int k,int y)//k->depth,y->lie
{
if(k==4&&y==0)//end
{
if(a[4][0]==1)
{
ans++;
}
return;
}
for(int i=0;i<3;i++)//i->0,1,2
{
if(i==0)//&
{
a[k+1][y]=a[k][y]&a[k][y+1];
if(k+y==3)dfs(k+1,0);
else
{
dfs(k,y+1);
}
}
if(i==1)//|
{
a[k+1][y]=a[k][y]|a[k][y+1];
if(k+y==3)dfs(k+1,0);
else
{
dfs(k,y+1);
}
}
if(i==2)//^
{
a[k+1][y]=a[k][y]^a[k][y+1];
if(k+y==3)dfs(k+1,0);
else
{
dfs(k,y+1);
}
}
}
}
int main()
{
dfs(0,0);
cout<<ans<<endl;
// 请在此输入您的代码
return 0;
}