战棋游戏 {游戏模拟+spfa}

原创 2016年10月30日 00:28:26
  • 【题目描述】

这里写图片描述
这里写图片描述
这里写图片描述

  • 【Input Format】

这里写图片描述

  • 【Output Format】

这里写图片描述

  • 【Sample Input】
    5 5 4 12
    1 9 1 4 4
    1 9 1 2 4
    1 9 1 1 2
    2 9 2 7 3
    2 3 2 6 1
    10 5 8 1 3 1 1 0
    20 10 5 1 2 2 1 0
    19 10 5 1 2 5 2 1
    25 25 3 1 1 5 5 0
    Round of 0
    Action of character 2
    Move to (5,1)
    Attack 3
    Action of character 1
    Move to (3,1)
    Round of 1
    Action of character 3
    Drive out 1
    Round of 0
    Action of character 2
    Drive out 3

  • 【Sample Output】
    0
    9
    6
    INVALID
    -1

  • 【数据规模与约定】
    对于80%的数据,不存在不合法事件。
    对于100%的数据,参见输入输出格式中给定的范围与保证。


【题解】模拟啊模拟 // 近几年复赛喜欢出的模拟题QAQ
{细节一}死掉的角色必须将其所有信息清空好,以免干扰后续行动;
{细节二}图上的点相当于有点权,必须用spfa而非广搜;spfa时记得判断移动力清零情况及边界问题;
{细节三}C++读入时要格外小心,听说好多god直接用读入优化,我就默默写了个长长的读入QAQ;
{细节四}如果某角色移动前后位置不变,即使它旁边存在其他阵营角色,其剩余行动力为初始行动力;
{细节五}大概没了有了再说呗。。。
//还是看程序吧哎TAT


#include <cstdio>
#include <cstring>
#define N 105
#define inf 1000000000
const int fx[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int n,m,c,e,x,Gr,hp[N],at[N],mv[N],ad[N][2],st[N][2],gr[N],
    a[N][N],q[N*N*100][2],g[N][N],op[10005][2],f[N][N];
bool bo[N][N],die[N];char s[10005][3];
    int bfs(int sx,int sy,int tx,int ty,int be,int ss)
    {
        for (int i=1;i<=n;++i)
            for (int j=1;j<=m;++j) bo[i][j]=false;
        for (int i=1;i<=n;++i)
            for (int j=1;j<=m;++j) f[i][j]=-inf;
        int h=1,t=1;f[sx][sy]=ss;
        for (bo[q[1][0]=sx][q[1][1]=sy]=true;h<=t;bo[q[h][0]][q[h++][1]]=false)
            for (int i=0;i<4;++i)
            {
                int xx=q[h][0]+fx[i][0],
                    yy=q[h][1]+fx[i][1];
                if (!xx || !yy || xx>n || yy>m || a[xx][yy] || 
                    f[q[h][0]][q[h][1]]<g[xx][yy]) continue;
                if (f[xx][yy]>=f[q[h][0]][q[h][1]]-g[xx][yy]) continue;
                bool boo=true;
                for (int j=0;j<4;++j)
                {
                    int xxx=xx+fx[j][0],yyy=yy+fx[j][1];
                    if (!xxx || !yyy || xxx>n || yyy>m || !a[xxx][yyy]) continue;
                    if (gr[a[xxx][yyy]]==be) boo=false;
                }
                if (!boo)
                {
                    f[xx][yy]=0;continue;
                }
                f[xx][yy]=f[q[h][0]][q[h][1]]-g[xx][yy];
                if (!bo[xx][yy]) bo[q[++t][0]=xx][q[t][1]=yy]=true;
            }
        return f[tx][ty];
    }
    int abs(int x){ return x>=0?x:-x;}
int main()
{
    scanf("%d%d%d%d\n",&n,&m,&c,&e);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j) scanf("%d",&g[i][j]);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j) a[i][j]=0;
    for (int i=1;i<=c;++i)
    {
        scanf("%d%d%d%d%d%d%d%d\n",&hp[i],&at[i],&mv[i],
            &ad[i][0],&ad[i][1],&st[i][0],&st[i][1],&gr[i]);
        a[st[i][0]][st[i][1]]=i;
    }
    for (int i=1;i<=e;++i) 
    {
        int len;
        scanf("%c",&s[i][1]);
        char ch=s[i][1];
        if (ch=='R') len=9;
        if (ch=='M') len=9;
        if (ch=='D') len=10;
        if (ch=='A')
        {
            scanf("%c",&s[i][2]);
            if (s[i][2]=='c') len=20;
            else len=7;
        }
        if (ch=='A') for (int j=3;j<=len;++j) scanf("%c",&ch);
        else for (int j=2;j<=len;++j) scanf("%c",&ch);
        if (s[i][1]=='M') 
        scanf("%d,%d)",&op[i][0],&op[i][1]);
        else scanf("%d",&op[i][0]);
        scanf("\n");
    }
    for (int i=1;i<=e;++i)
    {
        for (;i<=e && s[i][1]=='R';++i) Gr=op[i][0];
        for (;i<=e && s[i][1]=='A' && s[i][2]=='c';++i) x=op[i][0];
        if (i>e) break;
        if (x && s[i][1]=='R'){ --i;continue;}
        if (die[x]){ printf("INVALID\n");continue;} 
        if (x && s[i][1]=='M')
        {
            int xt=op[i][0],yt=op[i][1],j;
            if (xt==st[x][0] && yt==st[x][1]) 
            {
                printf("%d\n",mv[x]);continue;
            }
            int cost=bfs(st[x][0],st[x][1],xt,yt,1-Gr,mv[x]);
            if (cost<0) printf("INVALID\n");
            else 
            {
                printf("%d\n",cost);
                a[st[x][0]][st[x][1]]=0;
                a[st[x][0]=xt][st[x][1]=yt]=x;
            }
        }
        if (x && (s[i][1]=='A' || s[i][1]=='D'))
        {
            int y=op[i][0],dis=abs(st[x][0]-st[y][0])+abs(st[x][1]-st[y][1]);
            if (dis>=ad[x][0] && dis<=ad[x][1] && gr[y]!=gr[x])
            {
                int hpp=hp[y]-at[x];
                if ((hpp>0)==(s[i][1]=='A'))
                {
                    hp[y]-=at[x];
                    printf("%d\n",hp[y]);
                    if (hp[y]<=0)
                    {
                        a[st[y][0]][st[y][1]]=0;
                        die[y]=true;
                    } 
                }
                else printf("INVALID\n");
            }
            else printf("INVALID\n");
        }
    }
    return 0; 
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yellowdesk/article/details/52968874

【BZOJ3875】【Ahoi2014】骑士游戏 SPFA处理有后效性动规

题解: 首先一个点可以分裂成多个新点,这样就有了图上动规的基础。 即f[i]表示i点被消灭的最小代价,它可以由分裂出的点们更新。 但是这个东西有后效性,所以我们用SPFA来处理它。 spfa处...
  • Vmurder
  • Vmurder
  • 2015-03-03 17:26:03
  • 2070

BZOJ 3875 Ahoi2014 骑士游戏 SPFA

题目大意:给定n个怪物,每个怪物可以用魔法直接干掉,或者用物理攻击使其分裂为一些其他怪物,求杀掉1号怪物的最小花销 令f[i]为杀死i号怪物的最小花销,则f[i]=min(k[i],s[i]+Σf[...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-02-27 14:04:21
  • 1807

【bzoj3875】【AHOI2014】【骑士游戏】【spfa+dp】

Description  【故事背景】 长期的宅男生活中,JYY又挖掘出了一款RPG游戏。在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。 【问题描述】 在这个游戏中,...
  • sunshinezff
  • sunshinezff
  • 2015-10-06 20:02:19
  • 593

从0开始搭建一个战棋游戏的AI(初级教程)

战棋类游戏一直以高策略性著称,其中不乏经典之作如“三国志英杰传”、“三国曹操传”、“炎龙骑士团”、“金庸群侠传”等等。今天,我们就如何一步步从0开始实现一个简单的战棋类游戏AI,概述一下此类游戏AI的...
  • rcfalcon
  • rcfalcon
  • 2017-04-24 00:01:49
  • 3496

一个战棋游戏源码,制作相当精美

  • 2008年09月02日 11:40
  • 472KB
  • 下载

zoj3010The Lamp Game(状态压缩+SPFA求最大路)经典

The Lamp Game Time Limit: 2 Seconds Memory Limit: 65536 KB Little Tom likes playing games. ...
  • u010372095
  • u010372095
  • 2014-08-16 14:15:56
  • 914

【原创】【程序小游戏】平面四子棋 C++

平面四子棋事先声明:代码是我自个儿写的,规则不是我发明的~~~~。 我觉得我真是太不务正业了!规则在一个7*12的棋盘里,下四子棋。只不过,这个棋盘是竖立着的,它的棋子是从上往下掉的。 比如说: ...
  • c20182030
  • c20182030
  • 2017-05-20 22:30:58
  • 845

《游戏脚本的设计与开发》-(战棋部分)2.2 军队降临战场

上次讲了如何快速显示一张战场地图,有了战场没有军队怎么行,本次来向战场上添加军队。一般战棋游戏中,战场上的军队有三种,我军,敌军和友军。我军是可操纵的,敌军是可攻击的,友军是不可操纵,也不可攻击的。敌...
  • lufy_Legend
  • lufy_Legend
  • 2013-07-08 06:20:43
  • 19857

《游戏脚本的设计与开发》-(战棋部分)2.4 物理攻击

终于到了攻击部分了,战棋游戏中的攻击,主要分为物理攻击和法术攻击,本章就先从物理攻击讲起。物理攻击又分为普通攻击,连击(双击),以及致命攻击,再复杂一点的还有其他特殊攻击,比如我的《三国记-乱世群雄》...
  • lufy_Legend
  • lufy_Legend
  • 2013-08-12 10:32:59
  • 11502

bzoj 5056: OI游戏

最短路
  • herobrine_tkj
  • herobrine_tkj
  • 2017-09-29 21:48:28
  • 145
收藏助手
不良信息举报
您举报文章:战棋游戏 {游戏模拟+spfa}
举报原因:
原因补充:

(最多只允许输入30个字)