QAQ
思路:状态压缩+BFS
人的状态1为患病,0为没此病,那么初始的状态即为111~1(2^n-1)
目标状态0000~0
对于每个药处理两个数组
w1表示吃了该药治疗的病(0为治疗,1为无影响)
w2表示吃了该药患的病(1为患病,0为无影响)
每次拓展状态枚举所有药,对于吃了该药所得到的状态处理如下
假设当前状态为11111011
治疗为00000111
患病为00000110
可以看出后来的状态为00000111
那么设sum为当然状态
后来的状态=(sum&w1)|w2
对于每个状态进行标记
即可AC
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
struct tw{
int sum;
int step;
};
int w1[999],w2[999];
bool f[1<<10+1];
int n,m;
queue <tw> dl;
int BFS()
{
tw opt;
opt.sum=(1<<n)-1;
opt.step=0;
f[opt.sum]=1;
dl.push(opt);
while(!dl.empty())
{
tw x=dl.front();
dl.pop();
if(x.sum==0)
return x.step;
for(int i=1;i<=m;i++)
{
int sum1=(x.sum&w1[i]);
sum1=(sum1|w2[i]);
if(!f[sum1])
{
f[sum1]=1;
tw y;
y.step=x.step+1,y.sum=sum1;
dl.push(y);
}
}
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int l=0,r=0;
for(int j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
if(x==1) l+=1<<(j-1);
if(x==-1) r+=1<<(j-1);
}
w1[i]=~l;
w2[i]=r;
}
int d=BFS();
if(d==-1) printf("The patient will be dead.");
else printf("%d",d);
return 0;
}