bool樹的計算

2022-04-11 17:55:46 字數 1530 閱讀 9128

1.題目大意:

在布林邏輯中,析取正規化(dnf)是邏輯公式的標準化(或規範化),它是合取子句的析取。乙個邏輯公式被認為是 dnf 的,當且僅當它是乙個或多個文字的乙個或多個合取的析取。同合取正規化(cnf)一樣,在 dnf 中的命題運算元是與、或和非。非運算元只能用做文字的一部分,這意味著它只能領先於命題變數。

簡單來說,析取正規化是一些字句的邏輯或,而它的字句是乙個合取正規化;合取正規化是一些字句的邏輯或,而它的字句是乙個析取正規化。

本題中,邏輯樹最深的節點是乙個邏輯與,然後邏輯的與和或在每層交替出現。從最下層為一數起,奇數層是邏輯與,偶數層是邏輯或。

假設a=false,  b=true,  c=false,  d=true,  e=false那麼這顆bool樹的最終結果為false

上圖輸入資料形式為:((f(tf))(tf))

題解:既然是一顆樹,那麼很自然的會想到要建一棵樹,可是資料給的很噁心,要想建好一棵樹然後再來求解貌似不太好實現(不信你可以試試,反正我的失敗了)。

後來靈光一閃,讓我看出了端倪,樹不是一層一層的嗎,深搜不也是一層一層的嗎,我每次遇到乙個『(』號,就進行一次深搜,遇到『)』便結束搜尋。遇到t或者f便先儲存,最後根據該次搜尋的深度來決定是用或操作還是用與操作。

寫好提交,果斷ac,爽歪歪啊

view code

#include

<

iostream

>

#include

<

string

>

using

namespace

std;

char

str[

32005

];int

len;

intvisit[

32005

];int

dfs(

ints,

intdep)

}else

if(str[i]=='

t'||str[i]=='

f') //

本身深度,直接儲存結果

}else

if(str[i]=='

)') //

該深度計算結束}}

ans=

num[0];

if(dep%2

==0) //

偶數層用與操作

}else

//奇數層用或操作

}return

ans;

}int

main()

else

if(str[i]=='

)')dd

--;}if

(maxdd%2

==0) //

由於題目要求最後一層深度要用與操作,而我的想法是深蒐時偶數層相與奇數層相或,所以必須人工判別

else

}else

else}}

return0;

}

BOOL和bool的區別

bool和bool的區別 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別而bool是標準c...

BOOL和bool的區別

一 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別 二 bool是標準c 資料型別,可取值...

BOOL和bool的區別

一 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別 二 bool是標準c 資料型別,可取值...