这道题的关键是二进制的或与运算~
现在特别感激计算机基础的老师给了我们做bomb实验,受益匪浅。
#include <iostream>
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxm 105
#define maxn ((1<<20)+1)
using namespace std;
struct Node
{
int u,d;
Node(int i,int j):u(i),d(j){}
Node(){}
bool operator < (const Node & a)const
{
return d>a.d;
}
};
int n,m;
int c[maxm];//代价
int d[maxn];//距离
bool vis[maxn];
string s1[maxm],s2[maxm];//补丁
//是否匹配补丁
bool match(int u,int i)
{
for(int j = 0;j<s1[i].size();j++)
{
if(s1[i][j]=='+') if(!(u&(1<<j))) return false;
if(s1[i][j]=='-') if(u&(1<<j)) return false;
}
return true;
}
//打完补丁后的状态
int change(int u,int i)
{
//cout<<s2[i].size()<<endl;
for(int j = 0;j<s2[i].size();j++)
{
if(s2[i][j]=='+