10 条题解

  • 1
    @ 2023-6-9 14:48:19

    初稿(可忽略)

    这里我用一种\color{brown} 这里我用一种奇怪的输入方法\color{brown} 输入方法

    dfs()dfs()输入。

    dfs()dfs()里,while()while()输入,当遇到左括号(时,进入下一层dfs()dfs(),算完结果再return回去。这样就可以保证括号内先算

    如下图(以样例为例):

    image

    所以答案为:0110=10⊕1|1|0=1

    注:'⊕'符是&符。

    那么,如何算答案及回路?

    用一个字符变量fufu记录遇到的符号,输入的字符是cc,答案变量是ansans

    • 当遇到符号时: 若c == '&',那么fu = '&'。 若c == '|',那么fu = '|'
    • 当遇到数字时,就根据符号来更新ansans

    关于回路,算答案时加个判断即可。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int yu = 0,huo = 0;//记录与回路个数与或回路个数
    
    int tme = 0;//debug用,记录当前下标(从1开始记)
    
    void dfs1()//跳过括号内容函数
    {
    	int k = 1;//因为不能在遇到的第一个右括号处return(讲个笑话,我就s在这了)
    	char c;//疯狂跳过
    	while(cin >> c)
    	{
    		tme++;//下标更新
    		if(c == '(') k++;
    		if(c == ')') k--;
    		if(k == 0) return;
    	}
    	return;
    }
    
    bool dfs()
    {
    	bool ans = 0;
    	char fu = 'n';//记录符号(当前无符号)
    	char c;
    	while(cin >> c)
    	{
    		tme++;//下标++
    		if(c == '(')//要进入下一层dfs了
    		{
    			if(fu == '&' && ans == 0) dfs1();//若有了回路了,那么跳过下一个括号全部内容(即不计算括号内回路)
    			else if(fu == '|' && ans == 1) dfs1();//同上
    			else//表示前面无回路
    			{
    				bool x = dfs();//计算括号内的值
    				if(fu == '&') ans &= x;
    				else if(fu == '|') ans |= x;//更新答案
    				else ans = x;//若无符号,记得要直接赋值(讲个笑话,我又s在这儿了)
    			}
    		}
    		else 
    		{
    			if(c == ')') return ans;//若遇到右括号那么直接return(因为括号包在一起算的)
    		    else if(c == '&')
    		    {
    		    	fu = '&';//更新符号
    		    	if(ans == 0) yu++;//值为0,且遇到&,回路
    			}
    			else if(c == '|')
    			{
    				fu = '|';
    				if(ans == 1) huo++;//值为1,且遇到|,回路
    			}
    			else if(c == '0')//若为数字,更新答案
    			{
    				if(fu == '&') ans &= 0;
    				else if(fu == '|') ans |= 0;
    				else ans = 0;
    			}
    			else if(c == '1')//同上
    			{
    				if(fu == '&') ans &= 1;
    				else if(fu == '|') ans |= 1;
    				else ans = 1;
    			}
    		}
    	}
    	return ans;
    }
    
    signed main()
    {
    	cout << dfs();
    	printf("\n%d %d",yu,huo);
    	return 0;
    }
    

    这题s得有点惨

    image

    对了,其实用\color{yellow} 对了,其实用表达式树做也不是不行,可以试试\color{yellow} 做也不是不行,可以试试

    「CSP-J 2022」逻辑表达式(expr)

    信息

    ID
    2918
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    156
    已通过
    48
    上传者