vijosP1026毒药?解药?

hash。

怎么感觉叫状态压缩bfs比较合适呢?

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 10 + 5;
const int maxm = 100 + 10;
const int maxg = 1024 + 10;

bool st[maxn],h[maxg];
int mp[maxm][maxn];
int d[maxg][maxn];
int n,m,finish;

inline int Hash(bool a[]) {
    int x=1,s=0;
    for(int i=1;i<=n;i++) {
        s+=x*a[i];
        x*=2;
    }
    return s;
}

void bfs() {
    int l=0,r=1;
    finish=(1<<n)-1;
    while(l<r) {
        for(int i=1;i<=m;i++) {
            for(int j=1;j<=n;j++) {
                if(mp[i][j]==1) st[j]=1;
                else if(mp[i][j]==-1) st[j]=0;
                else st[j]=d[l][j];
            }
            int x=Hash(st);
            if(x==finish) {
                printf("%d\n",d[l][0]+1);
                return;
            }
            if(!h[x]) {
                h[x]=1;
                d[r][0]=d[l][0]+1;
                for(int j=1;j<=n;j++) d[r][j]=st[j];
                r++;
            }
        }
        l++;
    }
    printf("The patient will be dead.\n");
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&mp[i][j]);
    bfs();
    return 0;
}
时间: 2024-11-10 13:50:49

vijosP1026毒药?解药?的相关文章

Tyvj3308毒药解药题解

题目大意 这些药都有可能在治愈某些病症的同一时候又使人患上某些别的病症--经过我天才的努力.最终弄清了每种药的详细性能,我会把每种药能治的病症和能使人患上的病症列一张清单给你们,然后你们要依据这张清单找出能治愈全部病症的最少药剂组合--顺便说一声,病症的数目不超过10种.我的药是用不完的,就是说每种药剂都能够被反复使用. 题解 二进制表示患病状态(2n≤1024种)和每种药的治病与致病状态,然后从2n?1到0開始连有向边,然后bfs出最短路就可以.感觉这样对付一道搜索题大材小用了. Code #

搜索练习题【题解】

VIJOS-P1026 毒药解药 Description Sample Input Sample Output HINT Source Solution POJ3321Apple Tree Description Input Output Sample Input Sample Output Source Solution VIJOS-P1026 毒药?解药? Description 羽毛笔和im是抽签到同一个考场的,她们突然闻到一阵刺鼻的化学试剂的气味. 机灵鼠:(头都不抬)你们是考生么?还在

2594 解药还是毒药

2594 解药还是毒药 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那…那是解药还是毒药啊?)……,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症的最少药剂组合

codevs 2594 解药还是毒药

2594 解药还是毒药 http://codevs.cn/problem/2594/ 题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那-那是解药还是毒药啊?)--,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症的最少药剂组合--顺便说一声,病症的数目不超过

NOIP前夕:codevs,解药还是毒药

解药还是毒药 时间限制: 1 s 空间限制: 128000 KB 题目描述  Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那…那是解药还是毒药啊?)……,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症的最少药剂组合……顺便说一声,病症的数目不超过10种,而且他的药

解药还是毒药(codevs 2594)

2594 解药还是毒药 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那…那是解药还是毒药啊?)……,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症

codevs2594解药还是毒药(状压dp)

2594 解药还是毒药 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那…那是解药还是毒药啊?)……,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症的最少药剂组合……顺

解药还是毒药 codevs2594 状态压缩 BFS

我们用二进制来压缩状态,每一位上的0/1对应该位的病症是否存在 对于药剂的治愈与致病效果分开储存 如果状态a,要使用i药剂,i药剂的治愈效果是b,致病效果是c,那么状态a就可以转移为:(a-(a&b))|c 用宽搜可以保证时间复杂度的优越性(网上好像还有SPFA的解法,没深究过.) 宽搜遇到0就立即结束,因为这一定是最优解 附上代码 #include<cstdio> #include<cstring> #include<queue> #include<cm

十只老鼠和一千瓶毒药的故事。。。

问题描述:有1000个一模一样的瓶子,其中有999瓶是普通的水,有1瓶是毒药. 任何喝下毒药的生命都会在一星期之后死亡.现在你只有10只小白鼠和1个星期的时间,如何检验出哪个瓶子有毒药? 解答: 根据2^10=1024,所以10个老鼠可以确定1000个瓶子具体哪个瓶子有毒.具体实现跟3个老鼠确定8个瓶子原理一样.000=0001=1010=2011=3100=4101=5110=6111=7一位表示一个老鼠,0-7表示8个瓶子.也就是分别将1.3.5.7号瓶子的药混起来给老鼠1吃,2.3.6.7