【问题描述】
某国度的人,喜欢玩这样一个游戏,在一块板上写着一行数,共n个。两个游戏者,轮流从最右或最左取一个数。刚开始,每个游戏者的得分均为20。如果一个游戏者取下一个数,则将该数的值加到该游戏者的得分上,最后谁的得分最高谁就赢了游戏。给出这n个数( 从左往右), 假设游戏者都是非常聪明的,问最后两个人的得分(假设第一个人首先取数)。
【输入】
输入格式:第一行为n(2<=n<=100),第二行为n个数,每个数字之间均用空格隔开。
【输出】
输出为两个游戏者的得分。第一个数表示第一个游戏者的得分,第二个数为第二个游戏者的得分,两个数字之间用空格隔开。
程序运行后结果示例:
【样例输入】
6
4 7 2 9 5 2
【样例输出】
38 31
public class ScoreGame {
/**
* @param args
*/
public static void main(String[] args) {
Integer[] examp = new Integer[]{4,7, 2, 9, 5, 2};
LinkedList<Integer> queue = new LinkedList<Integer>();
queue.addAll(Arrays.asList(examp));
int scoreA = scoreFirst(queue)+20;
int scoreB = calcSum(queue)-scoreA+20;
System.out.println("A的得分: "+scoreA);
System.out.println("B的得分: "+scoreB);
}
public static int scoreFirst(Deque<Integer> queue){
if(queue.size()<2)
throw new IllegalArgumentException("数组个数不能小于2");
if(queue.size()==2){
int first = queue.pollFirst();
int last = queue.pollLast();
return first>=last?first:last;
}else{
int sum = calcSum(queue);
LinkedList<Integer> pollFirstQueue = new LinkedList<Integer>(queue);
pollFirstQueue.pollFirst();
int result1 = sum - scoreFirst(pollFirstQueue);
LinkedList<Integer> pollLastQueue = new LinkedList<Integer>(queue);
pollLastQueue.pollLast();
int result2 = sum - scoreFirst(pollLastQueue);
return result1>result2?result1:result2;
}
}
public static int calcSum(Deque<Integer> queue){
int sum = 0;
for(Integer i:queue){
sum+=i;
}
return sum;
}
}
运行结果:
A的得分: 38
B的得分: 11
没有用双端队列的做法:
public static int scoreFirst2(int[] array, int sIndex, int eIndex) {
if (eIndex - sIndex < 1)
throw new IllegalArgumentException("数组个数不能小于2");
if (eIndex - sIndex == 1) {
int first = array[sIndex];
int last = array[eIndex];
return first >= last ? first : last;
} else {
int sum = calcSum(array, sIndex, eIndex);
int result1 = sum - scoreFirst2(array, sIndex + 1, eIndex);
int result2 = sum - scoreFirst2(array, sIndex, eIndex - 1);
return result1 > result2 ? result1 : result2;
}
}
public static int calcSum(int[] array, int s, int e) {
int sum = 0;
for (int i = s; i <= e; ++i) {
sum += array[i];
}
return sum;
}
分享到:
相关推荐
3. **算法评价标准**:一个好的算法应该具有较高的效率、较低的空间复杂度以及易于理解和实现。 #### 三、常用算法设计技术 在游戏开发中,不同的问题往往需要采用不同的算法设计策略。以下是一些常用的设计技术:...
中国象棋游戏是一种深受中国人民喜爱的传统棋类游戏,它的算法实现是计算机科学与人工智能领域的一个经典实例。在本文中,我们将深入探讨中国象棋游戏的算法设计与实现,包括棋盘状态表示、棋子移动规则、游戏逻辑...
在这个名为“一个基于max-min算法以及深度强化学习的井字棋游戏.zip”的项目中,我们主要探讨了如何利用人工智能技术,特别是深度学习和max-min算法,来开发一个智能的井字棋游戏。井字棋,又称三子棋,是一个简单的...
遗传算法会根据每个神经网络的表现(游戏得分)进行选择,优秀的表现会被保留并与其他网络进行交叉操作,产生新的网络结构。同时,还会引入随机性以避免过早收敛,即进行突变操作,这有助于探索更广泛的设计空间。 ...
多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...
游戏的目标是在遵循特定规则下,通过一系列操作将多边形简化至只剩一个顶点,从而获得该顶点的最终数值作为游戏得分。这一过程涉及动态规划的思想,旨在寻找最佳的操作顺序以最大化或最小化最终得分。 #### 动态...
在这个游戏中,一个多边形由n个顶点组成,每个顶点都有一个整数值,每条边则带有运算符"+"或"*"。游戏开始时,玩家首先删除一条边,然后在接下来的n-1步中,每次选择一条边E,用新的顶点替换E及其连接的两个顶点V1和...
总的来说,通过研究和实现俄罗斯方块,我们可以深入理解二维空间操作、碰撞检测、随机生成、状态管理等基础算法和编程技巧,同时,这也是对C#语言特性和游戏开发的一个实际应用。如果你是一名编程爱好者,不妨尝试...
五子棋游戏的算法设计是实现智能AI的关键,它的核心在于评估棋局的得分,分数的准确性直接影响到电脑玩家的智能水平。在此过程中,我们首先需要对棋盘进行扫描,以便收集每个空位的棋型信息。这涉及到一个二维数组`g...
在本项目中,"基于max-min算法以及深度强化学习的井字棋游戏"是一个结合了经典博弈论策略与现代机器学习技术的实例。这个毕业设计或课程设计旨在让学生深入理解并应用这两种方法来创建一个能够自主学习和优化的井字...
在IT领域,特别是游戏开发部分,博弈算法是一个重要的研究方向,尤其在开发棋类游戏时。本项目聚焦于“五子棋”的Java实现,通过博弈算法来实现智能对战功能。下面将详细介绍五子棋的基本规则、Java编程语言在游戏...
多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...
本文将聚焦于一个经典的游戏——井字棋(Tic Tac Toe),探讨如何通过阿尔法贝塔剪枝算法(Alpha-beta pruning)来实现一个高效的人工智能对手。这个算法结合了极大极小搜索(Minimax Search)策略,使得AI在游戏中...
多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...
本项目聚焦于在雅达利游戏“Pong”中的应用,这是一种经典的双人乒乓球游戏,为DRL算法提供了一个简单但具有挑战性的测试平台。 在“Pong”游戏中,智能体的目标是通过控制挡板来拦截对方的球,防止其穿过底线,...
总之,"VC++6游戏编程"资源为初学者提供了一个实践和探索游戏编程的平台,同时也适合有一定经验的开发者复习和提升C++编程技巧。通过实际编写和调试这些游戏,不仅可以掌握编程技巧,更能体验到游戏开发的乐趣,增强...
本作品是一个将二进制转化为十进制的智力小游戏。 1.通过STM32F103ZET6产生二进制随机数,随机点亮四盏LED灯,蓝灯为最高位,即蓝灯亮时为1*2^3,红灯亮时为1*2^2,黄灯亮时为1*2^1,绿灯亮时为1*2^0。 2.通过四...
本项目以经典游戏——俄罗斯方块为载体,利用遗传算法进行智能决策,旨在为计算机科学、软件工程以及通信工程等相关专业的学生提供一个具有挑战性和实践性的课程设计案例。 首先,我们要理解遗传算法(Genetic ...
消除行的机制则涉及到了线性代数中的矩阵操作,游戏界面可以被视为一个矩阵,当某行被填满时,该行在矩阵中的元素全部变为“已填充”状态,随后该行被清除,所有位于上方的行向下移动,填补空缺,这类似于矩阵的行...
1. **游戏循环**:游戏的核心在于一个不断运行的循环,处理用户的输入、更新游戏状态并显示结果。循环通常包括“获取输入”、“更新游戏状态”和“渲染屏幕”三个步骤。 2. **矩阵和数组**:游戏的主网格通常由二维...