愤怒的小鸟

本文介绍了一款游戏“愤怒的小鸟”的算法解析问题,使用状压动态规划的方法来解决如何最少次数消灭所有障碍物的问题。通过枚举状态和猪的位置,确定最优的抛物线轨迹。

愤怒的小鸟(状压dp)

弹弓在(0, 0)处,有一堆猪在第一象限,问你用鸟打几次能把猪全部打掉。鸟的飞行路线是处在第一象限的抛物线。猪的个数n<=18。

这道题一看就是状压dp啊。。枚举2^n的状态,对于一个状态,它最前面的那个零,也就是最前面的还没打掉的猪,肯定是要被解决的。所以你就枚举另一个猪,确定抛物线,看看哪些猪被打到,然后转移状态就行了。时间复杂度\(O(n2^n)\)

#include <cstdio>
#include <cstring>
#include <algorithm>

const int maxn=18, INF=1e9; const double eps=1e-8;
int n, m, t, mi[maxn];
double pigx[maxn], pigy[maxn];
int link[maxn][maxn], f[1<<maxn];

inline double abs(double x){ return x<0?-x:x; }

void init_mi(){
    mi[0]=1;
    for (int i=1; i<maxn; ++i) mi[i]=mi[i-1]<<1;
}

int firzero(int x){
    for (int i=n-1; i>=0; --i)
        if ((x&mi[i])==0) return n-i-1;
    return -1;
}

int main(){
    init_mi();
    scanf("%d", &t);
    double a, b, bs, c1, c2, c3, c4;
    int pos, tmp;
    for (int tt=0; tt<t; ++tt){
        memset(link, 0, sizeof(link));
        scanf("%d%d", &n, &m);
        for (int i=0; i<n; ++i)
            scanf("%lf%lf", &pigx[i], &pigy[i]);
        for (int i=0; i<n; ++i)
            for (int j=0; j<n; ++j){
                if (i==j){
                    link[i][j]=mi[n-i-1];
                    continue;
                }
                bs=pigx[j]/pigx[i];
                c1=pigx[i]*pigx[i]*bs; c2=pigy[i]*bs;
                c3=pigx[j]*pigx[j]; c4=pigy[j];
                a=(c4-c2)/(c3-c1); b=(c4-a*c3)/pigx[j];
                if (a>=0) continue;
                for (int k=0; k<n; ++k){
                    if (abs(a*pigx[k]*pigx[k]+b*pigx[k]-pigy[k])<eps)
                        link[i][j]+=mi[n-k-1];
                }
            }
        std::fill(f, f+(1<<maxn), INF); f[0]=0;
        for (int i=0; i<(1<<n)-1; ++i){
            pos=firzero(i);
            for (int j=0; j<n; ++j){
                tmp=i|link[pos][j];
                f[tmp]=std::min(f[tmp], f[i]+1);
            }
        }
        printf("%d\n", f[(1<<n)-1]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/7759765.html

模拟愤怒小鸟游戏 1、系统需求: 用户方: 1、登录 输入用户名 密码 进行登录 2、选择愤怒小鸟进行游戏 包括: 鸟的类型、鸟的攻击值、攻击命中率 目前类型为:红色小鸟、黑色小鸟、蓝色小鸟 可以选择任意类型的五只鸟进行攻击 3、游戏开始后,五只鸟依次发起攻击,根据每只鸟的攻击值和命中率,计算分数 4、游戏结束后可将分数记录下来 5、可以查看以前的游戏分数 管理员方: 1、登录 默认 用户名:admin 密码:admin ,后期从XML文件中读出 用户名密码输入三次错误,则退出游戏 2、新增玩家 3、修改玩家 4、删除玩家 5、查询玩家 6、查询游戏 7、分数统计 8、参数设置 2、系统界面: 1、首页 ****************************************************** 愤 怒 的 小 鸟 请选择登录方式: 1、玩家登录 2、管理员登录 0、退出 ****************************************************** 2、选择“1、玩家登录” ****************************************************** 玩 家 登 录 请输入用户名: 请输入密码: ****************************************************** 如果用户名和密码输入正确(需要管理员添加玩家) 则出现界面如下: ****************************************************** 愤 怒 的 小 鸟 1、开 始 游 戏 2、查 看 成 绩 0、返 回 上 级 ******************************************************  2.1开始游戏 ****************************************************** 请 选 择 小 鸟 1、红色小鸟 攻击力:80 命中率:50% 2、黑色小鸟 攻击力:200 命中率:30% 3、蓝色小鸟 攻击力:50 命中率:80% 0、返 回 上 级 请选择(需要选择三个小鸟发起攻击,可相同也可不同): ****************************************************** 选择好后开始游戏: (假设选择了1只红色小鸟、1只黑色小鸟、1只蓝色小鸟) ****************************************************** 游戏开始: 帅气的红色小鸟飞了过来,它的攻击力是:80 攻击开始了。。。。。。 “Boom!”打中了野猪大王!Lucky!(命中目标) “额 额 。。。”没有打中!衰!!(没有命中) 笨重的黑色小鸟,它的攻击力是:200 攻击开始了。。。。。。 “Boom!”打中了野猪大王!Lucky!(命中目标) “额 额 。。。”没有打中!衰!!(没有命中) 最后发起攻击的是:轻盈的蓝色小鸟,它的攻击力是:50 攻击开始了。。。。。。 “Boom!”打中了野猪大王!Lucky!(命中目标) “额 额 。。。”没有打中!衰!!(没有命中) 攻击结束:您的总分数是:XXX 1、再 玩 一 局 2、返 回 菜 单 ******************************************************  2.2查看成绩 游戏时间 游戏分数 xxxx年xx月xx日 HH:mm:ss XXX xxxx年xx月xx日 HH:mm:ss XXX xxxx年xx月xx日 HH:mm:ss XXX xxxx年xx月xx日 HH:mm:ss XXX 1、返 回 上 级  2.3返回上级 返回首页 3、选择“2、管理员登录” ****************************************************** 管 理 员 登 录 请输入用户名: 请输入密码: ****************************************************** 如果用户名和密码输入正确(默认都为admin) 则出现界面如下: ****************************************************** 系 统 管 理 1、新 增 玩 家 2、修 改 玩 家 3、删 除 玩 家 4、查 询 玩 家 5、查 询 游 戏 6、分 数 统 计 7、参 数 设 置 0、返 回 ****************************************************** 如果密码输错三次则退出游戏。系统关闭  3.1 新增玩家 新增玩家: 请输入玩家的登录名:(必须要有字母,且在系统中唯一) 请输入玩家的密码:(必须要有字母和数字,且最少不能少于6位) 请输入玩家的昵称: 请输入玩家的性别:(只可输入男或女) 请输入玩家的年龄:(只可输入正整数,且最大不可大于99) 新增玩家成功! 1、继续新增玩家 0、返 回 上 级  3.2 修改玩家 请选择要修改的玩家: 1、xx1 2、xx2 3、xx3 4、XX4 选“1”修改xx1 选择要修改的属性: 1、玩家的密码:(必须要有字母和数字,且最少不能少于6位) 2、玩家的昵称: 3、玩家的性别:(只可输入男或女) 4、玩家的年龄:(只可输入正整数,且最大不可大于100) 0、返回上级  3.3 删除玩家 请选择要删除的玩家: 1、xx1 2、xx2 3、xx3 4、XX4 选“1”删除xx1 全部删除后不可再删除 0、返回上级  3.4 查询玩家 ******************************************************************** 玩家登录名 玩家昵称 玩家性别 玩家年龄 aaa aaa 男 18 bbb bbb 女 20 。。。。。。。。。 0、返 回 上 级 ********************************************************************  3.5 查询游戏 ******************************************************************************* 游戏时间 玩家登录名 分数  3.6分数统计 ******************************************************************************* 玩家登录名 总分数 总局数 幸运指数  3.7参数设置 ************************************************************************** 请 选 择 要 修 改 的 参 数 1、红色小鸟1 攻击力:100 命中率:50% 2、黑色小鸟2 攻击力:150 命中率:30% 3、蓝色小鸟3 攻击力:50 命中率:80% 4、管理员登录名 5、管理员密码 6、管理员最大登录次数 0、返 回 上 级 4、选择“0、退出” 系统提示“游戏结束。。。。。。”系统关闭
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值