原帖

  这两天一直在搞这个AI,提供的样例更本不是我的风格啊,看不懂更不会改。。。

  所以我自己写了一个AI的平台,现在在不断的修改AI的策略,smart样例还是很容易过的,让line的行走速度变慢一点到每回合15一下就可以了。这里大概写一下自己写了这么久,看了这么多别人的比赛的想法。

  首先进攻分两种,一种是集群的进攻,一种是离散的进攻。集群进攻容易被拦截,但是攻击力充足(ps:规则允许多个水滴在同一个地方),离散进攻(如smart的两边)则攻击力相对较弱,但是不容易被拦截。line的进攻属于集群性进攻,有一些逗比的AI非常有效就是将中路一分为二从稍微靠上一点和稍微靠下一点走,然后就赢了。。。。防守一般是集群防守,因为张开的话火力不足而且比较慢。对付smart那种可以,但是对付line就挂了。。集群防守一般集中于大脑周围,但是也会有漏洞(水滴太少),所以应该加一个流动的机制,一旦有脑内未被打的敌方水滴,就过去打一下。这个写着有点麻烦。。。然后离散进攻的时候可以选择走没有人打得到的地方,然后就非常的慢,还要在优化一下。。。感觉以后要写得更高级恐怕KD树是不得不写了。。。

  说一下我的AI平台,node代表水滴,水滴的命令有许多种,不详细介绍(看注释),大体流程是,读入-->下命令-->执行。有点像三国志9的模式。。。所有存活水滴用两个链表来存,代码如下(SymenAIalpha2)

  

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <cmath>
using namespace std; struct position
{
int x;
int y; position(int a=,int b=)
{
x=a;y=b;
} bool outofrange()
{
return (x>)||(x<=)||y>||y<=;
}
}; struct node
{
int number;
int level;
position pos;
position Gototar;//集合地
int tarnum;//攻击目标,-1,向Gototar移动,自由攻击
int blood; int followNum;//和几号计划一样,虚拟计划,不是实体。0 == 没有计划 bool alive;
int movetype;
node* next;
node* last; node(int a=,position tar=position(,),int bl=)
{
movetype=;
alive=true;
number=a;
level=;
Gototar=tar;
blood=bl;
tarnum=-;
next=last=NULL;
followNum=;
}
}; node plan[];
int plancnt=;
node blue[];
node red[];
int nextred[];
int nextblue[];
int cntred=-;
int cntblue=-;
int BBB=;
int RBB=;
double getdis(node a,node b) {return sqrt((a.pos.x-b.pos.x)*(a.pos.x-b.pos.x)+(a.pos.y-b.pos.y)*(a.pos.y-b.pos.y));}
double getdis(node a,position b) {return sqrt((a.pos.x-b.x)*(a.pos.x-b.x)+(a.pos.y-b.y)*(a.pos.y-b.y));}
double getdis(position a,position b) {return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));} bool inrand(node a,node b,int dis=)
{
int far=dis+a.level*;
double ds=getdis(a,b);
if (ds<=far)
return true;
return false;
}
bool inrand(node a,position b,int dis=)
{
int far=dis+a.level*;
double ds=getdis(a,b);
if (ds<=far)
return true;
return false;
} int defcnt=; node* redl;
node* bluel; node* Add(node* a,node* root)
{
if (!a->next)
{
a->next=root;
if (a->next)
a->next->last=a;
return a;
}
return NULL;
} bool Dlt(node* now)
{
if (now->next)
{
if (now->last)
{
now->last->next=now->next;
now->next->last=now->last;
}
else
{
now->next->last=now->last;
}
return true;
}
else
{
if (now->last)
{
now->last->next=NULL;
return true;
}
else
{
return false;
}
}
} node* Clean(node* root)
{
for (node* now=root;now;now=now->next)
{
if (!now->alive)
{
if (now==root)
root=now->next;
Dlt(now);
}
}
return root;
} position GetNextStep(node a,node b,int dis=)
{
double ds=getdis(a,b);
if (ds<=dis) return b.pos;
int dx=b.pos.x-a.pos.x;
int dy=b.pos.y-a.pos.y;
return position(a.pos.x+dx*(dis/ds),a.pos.y+dy*(dis/ds));
}
int biao1[]={-,-,,};
int biao2[]={-,,-,};
int AvoidEps=;
position GetNextStep2(node a,int b,int dis=)
{
int type=plan[b].movetype;
if (type==)
{
double ds=getdis(a,plan[b].Gototar);
if (ds<=dis) return plan[b].Gototar;
int dx=plan[b].Gototar.x-a.pos.x;
int dy=plan[b].Gototar.y-a.pos.y;
position ret=position(a.pos.x+dx*(dis/ds),a.pos.y+dy*(dis/ds));
if (getdis(a,ret)>dis) ret.x--;
return ret;
}
if (type==)
{
double ds=getdis(a,plan[b].Gototar);
// if (ds<=dis) return plan[b].Gototar;
int dx=plan[b].Gototar.x-a.pos.x;
int dy=plan[b].Gototar.y-a.pos.y;
int maxd=0x3f3f3f3f;
double minds=10101010101010.0;
position ret(,);
for (int i=-dis;i<=dis;++i)
{
for (int j=-dis;j<=dis;++j)
{
if (i*i+j*j>dis*dis) continue;
if (position(a.pos.x+i,a.pos.y+j).outofrange()) continue;
int sum=;
for (node* now=bluel;now;now=now->next)
{
if (inrand(*now,position(a.pos.x+i,a.pos.y+j),AvoidEps)) sum++;
}
if (sum==maxd)
{
double ds2=getdis(plan[b].Gototar,position(a.pos.x+i,a.pos.y+j));
if (ds2<minds)
{
minds=ds2;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
if (sum<maxd)
{
maxd=sum;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
}
return ret;
}
} //#define Debug
position GetNextStep(node a,int dis=)
{
int type=a.movetype;
if (type==)
{
double ds=getdis(a,a.Gototar);
if (ds<=dis) return a.Gototar;
int dx=a.Gototar.x-a.pos.x;
int dy=a.Gototar.y-a.pos.y;
position ret=position(a.pos.x+dx*(dis/ds),a.pos.y+dy*(dis/ds));
if (getdis(a,ret)>dis) ret.x--;
if (getdis(a,ret)>dis) ret.y--;
return ret;
}
if (type==)
{
double ds=getdis(a,a.Gototar);
if (ds<=dis) return a.Gototar;
int maxd=0x3f3f3f3f;
double minds=12356434543.45;
position ret(,);
for (int i=-dis;i<=dis;++i)
{
for (int j=-dis;j<=dis;++j)
{
if (i*i+j*j>dis*dis) continue;
if (position(a.pos.x+i,a.pos.y+j).outofrange()) continue;
int sum=;
for (node* now=bluel;now;now=now->next)
{
if (inrand(*now,position(a.pos.x+i,a.pos.y+j),AvoidEps))
sum++;
}
if (sum==maxd)
{
double ds2=getdis(a.Gototar,position(a.pos.x+i,a.pos.y+j));
if (ds2<minds)
{
minds=ds2;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
if (sum<maxd)
{
maxd=sum;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
}
return ret;
}
} int RandomShoot(node a,int k=)
{
int ret=-;
double mindis=12334444444.0;
for (node* now=bluel;now;now=now->next)
{
if (inrand(a,*now)&&now->alive)
{
if (k==)
return now->number;
if (k==)
{
double ds=getdis(a,*now);
if (ds<mindis)
{
mindis=ds;
ret=now->number;
}
}
if (k==)
{
if (now->pos.x<mindis)
{
mindis=now->pos.x;
ret=now->number;
}
}
}
}
return ret;
} int sho[];
int ta[];
int nowbunum=;
void Doit()
{
int atnum=,monum=;
//Att Turn
for (node* now=redl;now;now=now->next)
{
if (now->followNum)
{
int k=now->followNum;
if (plan[k].tarnum!=-)
{
int tarnum=plan[k].tarnum;
if (blue[tarnum].alive)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=tarnum;
blue[tarnum].blood--;
if (blue[tarnum].blood==)
{
blue[tarnum].alive=false;
plan[k].tarnum=-;
}
}
}
else
{
int t=RandomShoot(*now);
if (t!=-)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=t;
blue[t].blood--;
if (blue[t].blood==) blue[t].alive=false;
}
}
continue;
}
if (now->tarnum!=-)
{
int tarnum=now->tarnum;
if (blue[tarnum].alive)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=tarnum;
blue[tarnum].blood--;
if (blue[tarnum].blood==) blue[tarnum].alive=false;
}
else
{
int t=RandomShoot(*now);
if (t!=-)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=t;
blue[t].blood--;
if (blue[t].blood==) blue[t].alive=false;
}
}
}
else
{
int t=RandomShoot(*now);
if (t!=-)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=t;
blue[t].blood--;
if (blue[t].blood==) blue[t].alive=false;
}
}
//End Att Turn
}
//print
{
printf("%d\n",atnum);
for (int i=;i<=atnum;++i)
{
printf("%d %d\n",sho[i],ta[i]);
}
}
//End print
//MoveTurn
for (node* now=redl;now;now=now->next)
{
if (!now->followNum)
{
if (now->pos.x==now->Gototar.x&&now->pos.y==now->Gototar.y) continue;
monum++;
}
else
{
monum++;
}
}
//End MoveTurn
//Print
printf("%d\n",monum);
for (node* now=redl;now;now=now->next)
{
if (!now->followNum)
{
if (now->pos.x==now->Gototar.x&&now->pos.y==now->Gototar.y) continue;
position p=GetNextStep(*now);
now->pos=p;
printf("%d %d %d\n",now->number,p.x,p.y);
}
else
{
position p=GetNextStep2(*now,now->followNum);
now->pos=p;
printf("%d %d %d\n",now->number,p.x,p.y);
}
}
//End Print
//build
printf("%d\n",nowbunum);
for (int i=;i<=nowbunum;++i)
{
cntred++;
red[cntred].pos=position(,red[cntred].Gototar.y);
redl=Add(&red[cntred],redl);
printf("%d\n",red[cntred].pos.y);
}
nowbunum=;
//End build
} void init()
{
int ns;
scanf("%d",&ns);
for (int i=;i<=ns;++i)
{
int sho,tar;
scanf("%d%d",&sho,&tar);
blue[sho].level++;
red[tar].blood--;
if (red[tar].blood==)
{
red[tar].alive=false;
}
}
int nm;
scanf("%d",&nm);
for (int i=;i<=nm;++i)
{
int mover,xx,yy;
scanf("%d%d%d",&mover,&xx,&yy);
blue[mover].pos=position(xx,yy);
}
int nn;
scanf("%d",&nn);
for (int i=;i<=nn;++i)
{
++cntblue;
int y;
scanf("%d",&y);
blue[cntblue].pos=position(,y);
bluel=Add(&blue[cntblue],bluel);
}
scanf("%d%d%d%d",&ns,&ns,&ns,&ns);
} int _round=-; void AI()
{
++_round;
if (_round%==) nowbunum++;
if (red[].alive&&red[].pos.x==)
{
red[].Gototar=position(,);
}
if (plan[].Gototar.x<=)
plan[].Gototar.x+=;
} void PreMeet()
{
for (int i=;i<;++i)
{
red[i].Gototar=position(,);
red[i].followNum=;
blue[i].number=red[i].number=i;
}
plan[].Gototar=position(,);
red[].Gototar=position(,);
red[].movetype=;
cerr<<"Init Successfully"<<endl;
} int main()
{
#ifdef Debug
freopen("blue.in","r",stdin);
#endif
PreMeet();
while(true)
{
init();
Clean(redl);
Clean(bluel);
cerr<<"Read Successfully"<<endl;
AI();
cerr<<"AI Successfully"<<endl;
Doit();
Clean(redl);
Clean(bluel);
cerr<<"Do Successfully"<<endl;
}
return ;
}

“国家队爷”杯液体战争AI比赛!!__SymenYang的更多相关文章

  1. 沈抚示范区·“华为云杯”2021全国AI大赛圆满落

    摘要:以赛促学,赛教结合!驱动AI产业繁荣发展 本文分享自华为云社区<云聚沈抚 · 智赢未来!沈抚示范区·"华为云杯"2021全国AI大赛圆满落幕>,作者:灰灰哒. 近 ...

  2. 代码审计-四叶草杯线下awd比赛源码web2

    今晚简单来看看那天比赛的源码吧,比赛的时候还是有些慌没有好好去静下心看代码. awd给的题中的漏洞,都是那种可以快速让你利用拿到权限后得到flag的那种,特别复杂利用的一般没有. 建议先黑盒去尝试,例 ...

  3. Java实现 蓝桥杯 算法提高 歌唱比赛(暴力)

    试题 算法提高 歌唱比赛 问题描述 X市正在进行歌唱比赛,请你写一个程序计算得分. 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: 1.歌唱得分占70% 2.才艺展示得分占20% 3.观 ...

  4. Java实现 蓝桥杯VIP 算法训练 比赛安排

    问题描述 设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛.设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛. 输入格式 输入 ...

  5. Java实现 蓝桥杯 算法提高 歌唱比赛

    试题 算法提高 歌唱比赛 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X市正在进行歌唱比赛,请你写一个程序计算得分. 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: ...

  6. AI贪吃蛇(二)

    前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...

  7. 24分钟让AI跑起飞车类游戏

    本文由云+社区发表 作者:WeTest小编 WeTest 导读 本文主要介绍如何让AI在24分钟内学会玩飞车类游戏.我们使用Distributed PPO训练AI,在短时间内可以取得不错的训练效果. ...

  8. 法律AI数据及应用

    本文简单列举了法律AI目前的应用,数据集,研究方向. 历史 1970年,Buchanan和Headrick发表文章"关于人工智能和法律推理的一些猜测",讨论了对法律研究和推理进行建 ...

  9. AI赌神称霸德扑的秘密,刚刚被《科学》“曝光”了

    AI赌神称霸德扑的秘密,刚刚被<科学>“曝光”了 称霸德州扑克赛场的赌神Libratus,是今年最瞩目的AI明星之一. 刚刚,<科学>最新发布的预印版论文,详细解读了AI赌神背 ...

随机推荐

  1. 嵌入式LinuxC语言程序设计基础教程

    第1章 嵌入式LinxuC语言开发工具 第2章 数据 第3章 数据的输入输出 第4章 运算符和表达式 第5章 程序结构和控制语句 第6章 数组 第7章 指针 第8章 函数 第9章 用户自定义数据类型 ...

  2. 洛谷 4302 BZOJ 1090 SCOI2003 字符串折叠 UVA1630 Folding(输出方案版)

    [题解] 区间DP.  设f[i][j]表示i~j的最小代价.再枚举中间点k,很容易想到转移方程为f[i][j]=min(f[i][j],f[i][k]+f[k][j]),同时如果i~k可以通过重复获 ...

  3. 【19】AngularJS 应用

    AngularJS 应用 现在是时候创建一个真正的 AngularJS 单页 Web 应用(single page web application,SPA)了. AngularJS 应用实例 现在可以 ...

  4. hdu 1533KM算法

    #include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #defi ...

  5. apt-get使用指南

    最近频繁使用apt-cache show(查看软件包详细信息)与apt-cache search(搜寻具体软件包确切名称)命令,深感方便与功能强大.现将一些apt-get相关命令做一个简单的收集: a ...

  6. Win32编程API 基础篇 -- 6.菜单和图标

    菜单和按钮 例子:菜单1 本小节仅仅向你展示如果向你的窗口中加入一个基本的菜单,通常你会用到一个提前制作好的菜单资源,这会是一份.rc文件并且会被编译链接进你的.exe可执行程序中.这是具体的流程做法 ...

  7. E - Super Jumping! Jumping! Jumping! DP

    Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. May ...

  8. DELPHI新版本WEBSERVICE的变化

    DELPHI新版本WEBSERVICE,不仅可以编译成ISAPI DLL,依靠IIS部署, 并且还可以编译成单独的EXE,不再依赖IIS就可以独立运行,这一点未尝不可以说是非常方便的改进.

  9. 常见的各品牌路由器默认IP地址汇总清单

    常见的各品牌路由器默认IP地址汇总清单 下面是各常见品牌路由器的默认IP清单: 如果您使用的设备品牌不在上述列表中,也可以试着访问下RouterIPAddress.com或SetupRouter.co ...

  10. 阿牛的EOF牛肉串-记忆化搜索或动态规划

    C - 阿牛的EOF牛肉串 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...