【第22期】观点:IT 行业加班,到底有没有价值?

战棋游戏 {游戏模拟+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; 
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

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

上次讲了如何快速显示一张战场地图,有了战场没有军队怎么行,本次来向战场上添加军队。一般战棋游戏中,战场上的军队有三种,我军,敌军和友军。我军是可操纵的,敌军是可攻击的,友军是不可操纵,也不可攻击的。敌军和友军之间会相互攻击。当然,一些更复杂的游戏中,以不同的势力来区分,之间的攻击关系以它们之间的敌对...

10年 ZZUPC校赛第三题 游戏棋(模拟~!)

游戏棋TimeLimit: 1000MS  MemoryLimit: 32768 KbDescription       相信大家都听说过大富翁这个游戏,一个不断进行色子抛出和买卖的格子游戏。在这...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

《游戏脚本的设计与开发》-(战棋部分)第七章 快速显示一张战场地图

今天开始脚本设计的第二部分,战棋游戏的开发。战棋游戏中我尤其喜爱光荣的英杰传和曹操传,我的多平台游戏三国记,也是以三国志曹操传为模板而开发的。本次也不例外,就从曹操传的移植为基础来开发,再进行扩展,从而实现自己的战棋游戏的开发。熟悉曹操传的朋友们都知道,曹操传分为R剧情部分和S战场部分,R剧情部分是...

Java版桌面战棋游戏TLOH(The Legend of Heroes)开发预告

按照本年度计划,年内笔者将继续开发Loonframework,前年及去年写的一些陈旧代码将被替换,有部分架构将重写。但实际上讲,剔除的代码中很多上并非不可用,而仅仅是不够规范,需要重构以满足组件化需要...

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

上次讲了如何快速显示一张战场地图,有了战场没有军队怎么行,本次来向战场上添加军队。一般战棋游戏中,战场上的军队有三种,我军,敌军和友军。我军是可操纵的,敌军是可攻击的,友军是不可操纵,也不可攻击的。敌军和友军之间会相互攻击。当然,一些更复杂的游戏中,以不同的势力来区分,之间的攻击关系以它们之间的敌对...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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