2021内蒙古自治区第十六届“华讯杯”大学生程序设计竞赛---- 将军棋

本文主要是介绍2021内蒙古自治区第十六届“华讯杯”大学生程序设计竞赛---- 将军棋,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这天Alice和Bob在玩一个经典的棋盘游戏——将军棋。 由于将军棋的规则比较复杂,他们决定玩简化版的将军棋,简化后的规则如下:

  1. 游戏开始在一个N*M的地图上,每个格子的位置由(x,y),x∈[1,N],y∈[1,M]表示。每个格子可以驻扎一些小兵。
  2. 开始前Alice和Bob各占据一个格子,称为各自的城堡。城堡开始时有若干个小兵。初始时地图上除了各自的城堡所在的格子,都为空(即没有任何一方的小兵)。
  3. 游戏有Q个回合,每个回合每人行动一次,每回合都是Alice先行动。在每个回合中,当前行动的人必须选择一个格子并命令该格子里的小兵移动,这个格子必须满足:
  • 格子里有兵,且数量大于1
  • 格子里的兵属于当前行动者的阵营
  1. 选定格子后,当前行动的人还需选择一个方向(上下左右中的一个),然后留下且仅留下一个小兵在选定的格子里,其余的小兵都移动到对应方向的相邻格子里(以下称为目标格子)。当然,目标格子必须在棋盘内。
  2. 此时有三种情况:
  • 若目标格子为空:移动的兵力直接进入目标格子,数量不变
  • 若目标格子不为空且目标格子里的兵力和行动者属于同一阵营:两批兵力合并,数量相加
  • 若目标格子不为空且目标格子里的兵力和行动者不属于同一阵营:此时两批兵力会发生战斗 Ⅰ.若两批兵力数目相同,则他们会同归于尽,即战斗后目标格子会变成空 Ⅱ.若目标格子里的兵力数量更多,则移动的兵力会全部死亡,而目标格子里的兵力数量会减少移动的兵力数量。 Ⅲ.若移动的兵力数量较多,则目标格子的兵力会全部死亡,移动的兵力会减少目标格子的兵力数量,然后进驻目标格子
  1. 每个人在行动开始前,她的城堡里将会多出一个兵的数量,这样就能保证一定可以行动。
  2. 如果在任意一次行动后,一个阵营的城堡里被对方阵营进驻(或者变为空),该阵营输掉比赛,另一方赢得比赛。此时比赛结束, 后面的回合就不用执行了。
  3. 现在已知双方所有的行动,要求输出游戏结果。
  4. 若Alice获胜,输出"Alice wins!!!",反之输出"Bob wins!!"(均不含引号)
  5. 若Q个回合后仍无人获胜,视为平局,输出"draw!"
  6. 输出获胜结果后,换行输出两个整数,分别代表Alice和Bob的分数。一方的分数即地图上所有属于她的兵力的和。 具体见样例和样例解释(有图片解释)

图片 1.png

输入格式:

第一行一个正整数T(T<=10),表示数据组数 对于每组数据: 第一行两个正整数N,M(1<=N,M<=400) 接下来一行三个正整数xa​,ya​,cnta​,表示Alice城堡的坐标(xa​,ya​)和初始的小兵数量 接下来一行三个正整数xb​,yb​,cntb​,表示Bob城堡的坐标(xb​,yb​)和初始的小兵数量,保证cnta​,cntb​>1 接下来一个正整数Q(1<=Q<=100000),表示总回合数 接下来Q*2行,表示每个回合的行动 对于每个回合,输出两行,第一行表示Alice的行动,第二行表示Bob的行动 每次行动用两个正整数和一个字符表示,字符只属于{U,D,L,R},表示上下左右的四个方向 例如"3 3 U"表示将(3,3)的格子向上移动(保证行动一定合法,即当前格子属于行动方且兵数>1)

输出格式:

对于每组测试数据: 第一行输出“Alice wins!!!”,“Bob wins!!”,“draw!"中的一个,表示游戏结果 第二行输出两个整数,分别表示Alice和Bob的分数

输入样例:

1
3 3
1 1 6
3 3 13
4
1 1 R
3 3 L
1 2 D
3 2 U
1 1 R
2 2 U
1 1 D
1 2 L

输出样例:

Bob wins!!
1 8
#include <bits/stdc++.h>
using namespace std;struct in
{int num;int who;
}q[405][405];int t,n,m,x1,y_1,x2,y2;///Alice为1;
///Bob为2;
int fun(int x,int y,char d,int who)
{int newx=x;int newy=y;if(d=='U')newx--;else if(d=='D')newx++;else if(d=='L')newy--;else if(d=='R')newy++;if(q[newx][newy].num==0){int temp=0;///记录每一步应该走几个兵;temp=q[x][y].num-1;q[x][y].num=1;q[newx][newy].num=temp;q[newx][newy].who=who;}else{///该目标位置有兵,判断是否是己方阵营///如果是己方阵营;if(q[newx][newy].who==who){int temp=q[x][y].num-1;q[newx][newy].num=temp+q[newx][newy].num;q[x][y].num=1;}else{///如果不是己方阵营///如果兵力大于目标兵力,则可以覆盖;if(q[newx][newy].num-(q[x][y].num-1)<0){int temp=q[x][y].num-1;q[newx][newy].num=temp-q[newx][newy].num;q[x][y].num=1;if(q[newx][newy].who==1)q[newx][newy].who=2;elseq[newx][newy].who=1;}else if(q[newx][newy].num-(q[x][y].num-1)>0){int temp=q[x][y].num-1;q[newx][newy].num=q[newx][newy].num-temp;q[x][y].num=1;}else if(q[newx][newy].num-(q[x][y].num-1)==0){q[newx][newy].num=0;q[x][y].num=1;q[newx][newy].who=0;}}}if(q[x1][y_1].num==0||q[x1][y_1].who==2)return 1;else if(q[x2][y2].num==0||q[x2][y2].who==1)return 2;elsereturn 0;
}int main()
{cin>>t;while(t--){cin>>n>>m;cin>>x1>>y_1;cin>>q[x1][y_1].num;q[x1][y_1].who=1;cin>>x2>>y2;cin>>q[x2][y2].num;q[x2][y2].who=2;int w;cin>>w;w*=2;int e=1;///每一回合该阵营会加一个兵;int mark=0;while(w--){int x,y;char d;cin>>x>>y>>d;if(mark>0)continue;if(e%2==1){q[x1][y_1].num+=1;mark=fun(x,y,d,1);}else{q[x2][y2].num+=1;mark=fun(x,y,d,2);}e++;}int cnt1=0,cnt2=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(q[i][j].who==1)cnt1+=q[i][j].num;else if(q[i][j].who==2)cnt2+=q[i][j].num;}}if(q[x1][y_1].who==1&&q[x2][y2].who==2)cout<<"draw!"<<endl;else if( (q[x1][y_1].who==2&&q[x2][y2].who==2) ||q[x1][y_1].num==0||mark==1 )cout<<"Bob wins!!"<<endl;else if((q[x1][y_1].who==1&&q[x2][y2].who==1) ||q[x2][y2].num==0 ||mark==2 )cout<<"Alice wins!!!"<<endl;cout<<cnt1<<" "<<cnt2<<endl;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)q[i][j].who=q[i][j].num=0;}return 0;
}

这篇关于2021内蒙古自治区第十六届“华讯杯”大学生程序设计竞赛---- 将军棋的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/314019

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区