UVA11795 Mega Man's Mission
Posted nsd-email0820
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA11795 Mega Man's Mission相关的知识,希望对你有一定的参考价值。
题面
你要杀n个怪,每杀掉一个怪那个怪会掉落一种武器,这种武器可以杀死特定的怪。游戏初始你有一把武器,能杀死一些怪物。每次只能杀一只,求有多少种杀怪方法。n≤16
分析
f[i]的i的二进制表示每个怪物是否被杀死,f[i]的值表示目前这种状态的方案数。最后答案为f[(1<<n)-1]
同时用s[i]表示状态为i的怪已经被杀了后得到的武器能杀死哪些怪。
转移:如果这些怪在i状态时未被杀且i状态的武器能够杀死这个怪,就把这些怪杀了
代码
#include<bits/stdc++.h> using namespace std; #define N 18 #define ll long long int t,n,mx,cas; int k[1<<N],s[1<<N]; ll f[1<<N]; char c[N]; inline void init() { mx=(1<<n)-1;cas++; memset(s,0,sizeof(s)); memset(f,0,sizeof(f)); memset(k,0,sizeof(k)); } int main() { scanf("%d",&t); while(t--) { scanf("%d%s",&n,c); init(); for(int i=0;i<strlen(c);i++) if(c[i]==‘1‘) s[0]|=(1<<i); for(int i=0;i<n;i++) { scanf("%s",c); for(int j=0;j<strlen(c);j++) if(c[j]==‘1‘) k[i]|=(1<<j); } for(int i=0;i<=mx;i++) { s[i]=s[0]; for(int j=0;j<n;j++) if(i&(1<<j)) s[i]|=k[j]; } f[0]=1; for(int i=0;i<=mx;i++) { if(!f[i])continue; for(int j=0;j<=n;j++) if(((i&(1<<j))==0)&&((s[i]&(1<<j))!=0)) f[i|(1<<j)]+=f[i]; } printf("Case %d: %lld ",cas,f[mx]); } }
以上是关于UVA11795 Mega Man's Mission的主要内容,如果未能解决你的问题,请参考以下文章
UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)
uva 658It's not a Bug, it's a Feature!(图论--Dijkstra算法+二进制表示)