Problem Description
Xiaoqiang entered the “shortest code” challenge organized by some self-claimed astrologists. He was given a boolean function taking n inputs (in C++):
bool f(bool x1, bool x2, bool x3){
//your code goes here
//return something
}
All possible inputs and expected outputs of this function have been revealed:
Xiaoqiang’s code must be like:
bool a = NAND(b, c);
where “a” is a newly defined variable,“b” and “c” can be a constant (0/1) or a function parameter (x1/x2/x3) or a previously defined variable. NAND is the “not-and” function:
NAND(b, c)=!(b&&c)
Because NAND is universal, Xiaoqiang knew that he could implement any boolean function he liked. Also, at the end of the code there should be a return statement:
return y;
where y can be a constant or a function parameter or a previously defined variable. After staring at the function for a while, Xiaoqiang came up with the answer:
bool a = NAND(x1, x2);
bool b = NAND(x2, x3);
bool y = NAND(a, b); return y;
Xiaoqiang wants to make sure that his solution is the shortest possible. Can you help him?
bool f(bool x1, bool x2, bool x3){
//your code goes here
//return something
}
All possible inputs and expected outputs of this function have been revealed:

Xiaoqiang’s code must be like:
bool a = NAND(b, c);
where “a” is a newly defined variable,“b” and “c” can be a constant (0/1) or a function parameter (x1/x2/x3) or a previously defined variable. NAND is the “not-and” function:
NAND(b, c)=!(b&&c)
Because NAND is universal, Xiaoqiang knew that he could implement any boolean function he liked. Also, at the end of the code there should be a return statement:
return y;
where y can be a constant or a function parameter or a previously defined variable. After staring at the function for a while, Xiaoqiang came up with the answer:
bool a = NAND(x1, x2);
bool b = NAND(x2, x3);
bool y = NAND(a, b); return y;
Xiaoqiang wants to make sure that his solution is the shortest possible. Can you help him?
Input
The first line contains an integer T (T ≤ 20) denoting the number of the test cases.
For each test case, there is one line containing 8 characters encoding the truth table of the function.
For each test case, there is one line containing 8 characters encoding the truth table of the function.
Output
For each test case, output a single line containing the minimum number of lines Xiaoqiang has to write.
Sample Input
1 00010011
Sample Output
4HintDue to the small input domain, you can solve all the cases on your computer and submit a program with a table of all the answers.
Source
思路:暴搜打表。 DFS的时候注意剪枝,递归的时候把i和j往下传,这是一个很有效的剪枝。
#include <stdio.h>
#define max(A,B)(A>B?A:B)
int num[1<<8],ans[1<<8],zh[256][256],cnt;
bool vis[1<<8];
void dfs(int dep,int x,int y)
{
int i,j;
if(ans[num[cnt-1]]>dep) ans[num[cnt-1]]=dep;
if(dep==10) return;
for(i=x;i<cnt;i++)
{
for(j=(i==x?y:0);j<=i;j++)//这里是关键
{
if(!vis[zh[num[i]][num[j]]])
{
vis[zh[num[i]][num[j]]]=1;
num[cnt++]=zh[num[i]][num[j]];
dfs(dep+1,i,j);
vis[zh[num[i]][num[j]]]=0;
cnt--;
}
}
}
}
int main()
{
int i,j;
num[0]=240;//00001111
num[1]=204;//00110011
num[2]=170;//01010101
num[3]=0;//00000000
num[4]=255;//11111111
for(i=0;i<(1<<8);i++) ans[i]=11;
vis[240]=vis[204]=vis[170]=vis[0]=vis[255]=1;
ans[240]=ans[204]=ans[170]=ans[0]=ans[255]=1;
for(i=0;i<256;i++) for(j=0;j<256;j++)
{
zh[i][j]=~(i&j);
zh[i][j]&=0x000000FF;
}
cnt=5;
dfs(1,0,0);
for(i=0;i<(1<<8);i++) printf("%d,",ans[i]);
}