当前位置: 首页 > news >正文

算法学习(十一)

1.King and Queen

说明:像国际象棋这样的游戏算法编程有两个主要任务:

1.评估位置,检查哪些部分可以走;

2.构造一种极小的算法来选择移动到最优值的位置。

让我们先来解决一个简单的问题:有一个棋盘,有8 x 8个方格。上面有白色的国王和黑色的女王。检查女王是否能吃掉国王。

女王可以垂直、水平的或沿任何两个对角线移动到任何距离。

8  - Q - - - - - -     - - - - - - - -
7  - - - - Q - - -     - - - - - - Q -
6  - - - - - - - -     - - - - - - - -
5  - - - - - - - -     - - - Q - - - -
4  - K - - - - Q -     - - Q - - - - -
3  - - - - - - - -     - - - - - - - -
2  - - - Q - - - -     - - - - - K - -
1  - - - - - - - -     - Q - - - - - -
   a b c d e f g h     a b c d e f g h

看看这两个例子,用图表绘制的板。在这两种情况下,国王都用字母K表示,而字母Q则显示了女王的不同位置。

在左边的棋盘中,国王可以被四个女王中的任何一个“吃掉”;

在正确的棋盘中,国王处于安全的位置——四个女王中没有一个能吃掉他。

输入数据:第一行中包含测试用例数。

下面一行描述每个test_case的国王和王后的位置,通过指定它们的方块(国王是第一个)。

答案:每一个测试给出一个字母Y或N,这代表国王能否被吃掉。用空格间隔。

例如:

input data:
8
b4 b8
b4 e7
b4 d2
b4 g4
f2 b1
f2 c4
f2 d5
f2 g7

answer:
Y Y Y Y N N N N

 

测试数据:

26
f4 e8
c4 b6
h2 h8
h8 f8
e8 d3
a8 c6
g7 h8
d3 e2
g1 a2
e2 g5
c7 d3
f2 b3
a6 e2
e7 g4
f7 c2
b7 c1
h3 b5
e1 a7
g4 b5
e4 g6
a3 h5
b6 h7
e3 h6
a3 f1
e7 e1
g6 h6

 

代码如下:

 1 horizontally = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']  # 水平的坐标表示
 2 
 3 test_cases = int(input())  # 测试用例数
 4 
 5 for i in range(test_cases):
 6     data = input().split()
 7     K, Q = data[0], data[1]  # 得到K,Q的坐标
 8     if K[0] and Q[0] in horizontally:
 9         if K[0] == Q[0] or K[1] == Q[1]:  # 当K,Q横纵坐标有一个相同,则为Y
10             print('Y', end=' ')
11         elif abs(horizontally.index(K[0]) - horizontally.index(Q[0])) == abs(int(K[1]) - int(Q[1])):
12             print('Y', end=' ')   # 当两坐标的横纵坐标之差相等,也为Y
13         else:   # 其他情况为N
14             print('N', end=' ')
15 
16 输出:N N Y Y N Y Y Y N N N N Y N N N N N N Y N N Y N Y Y

 

2.Cards Shuffling(洗牌问题)

说明:对于任何类型的纸牌游戏来说,洗牌是很重要的。因为只有很少的编程语言有内置函数来随机地对数组进行随机处理(比如PHP),所以有必要学习一些有用的算法。

用下列符号来描述卡牌:

ranks: A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K
suits: C, D, H, S

CQ是“梅花Q”,HT是“心桃10”,D2是“方块2”,SA是“黑桃A”。
总共有52张牌,所以在洗牌之前,它们应该被放入52个元素的数组中。该数组的初始顺序如下:13张梅花牌,13张方块牌,13张红心牌,最后13张黑桃牌。每个花色卡的内部都是由Ace排列到King的,所以整个甲板看起来是这样的:

[ CA, C2, C3, ..., CQ, CK, DA, D2, ..., DK, HA, H2, ..., HK, SA, S2, ..., SK ]

然后你应该对每张卡片产生一些随机数在0。将这张牌与另一张牌交换,占据所选的位置(让数组的索引从0开始)。

FOR i = 0 ... 51 :
    LET j = RANDOM(0 ... 51)
    SWAP deck[i] WITH deck[j]

例如,我们取第一张卡CA,并为它生成随机值15,这意味着该卡应该移动到位置15,D3在那里,D3应该被移回位置0。然后我们从位置1中取出C2然后生成下一个随机数50,所以C2和平方交换。等等。

你将会得到一个非负整数随机数字的序列——如果它们大于必要的数字,那么就把它们调整到需要的范围,取52的模数。

输入数据:将包含52个非负整数,您应该使用它们来像描述的那样进行洗牌。

答案:应该包含洗牌数组的卡片,和空格分开。

例如:

input data:
5814 1316 2080 2712 0 647 8098 315 44 6354 7867 100 61 763 6731 685 42 9309 569 92 701 562 85 8311 698 220 929 71 684 518 113 61 19 168 745 16 655 9548 6018 2686 25 785 81 721 964 85 44 614 4 509 8708 19

answer:
C5 D5 S4 C8 CQ S3 HK C9 H3 H6 D3 ST DT HT C6 CK DA H9 SJ SK DK C2 DQ S5 H4 D7 S7 S2 C4 D9 CT HJ HQ D2 SA CA H5 H2 C7 D4 CJ D6 S9 HA S8 D8 S6 SQ C3 DJ H8 H7

 

测试数据:

0 537 320 6335 7581 140 4682 9944 2755 438 897 48 17 406 82 2368 1402 3179 524 3802 37 81 4993 68 6792 32 206 1300 61 43 950 244 44 550 5140 2434 4513 72 4007 726 51 66 8439 9450 956 872 363 100 679 436 48 739

 

代码如下:

 1 ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K']
 2 suits = ['C', 'D', 'H', 'S']
 3 start_deck = []  
 4 for i in range(52):
 5     suit = i // 13
 6     rank = i % 13
 7     card = suits[suit] + ranks[rank]
 8     start_deck.append(card)   # 构造初始化牌组,按要求排好
 9 
10 num = input().split()
11 nums = []
12 for i in num:
13     nums.append(int(i) % 52)  # 得到随机的位置数
14 
15 m = 0
16 for n in range(52):
17     start_deck[n], start_deck[nums[m]] = start_deck[nums[m]], start_deck[n]  # 按规则交换赋值卡牌
18     m += 1
19 
20 for i in start_deck:  # 格式化输出卡牌
21     print(i, end=' ')
22 
23 输出:H2 CT C7 S9 D6 HJ D7 C8 SK D3 DA S8 C2 S4 H6 HT DJ CK S3 C9 SJ H4 D5 SQ H7 DQ D4 CA DT C4 H8 C6 S6 H5 DK CJ C5 HQ D9 HA S7 D2 H3 S5 D8 C3 S2 CQ SA H9 HK ST

 

转载于:https://www.cnblogs.com/zt19994/p/7413237.html

相关文章:

  • 【Java核心计算 基础知识(第9版)】第4章 对象与类
  • FPGA之verilog静态数码管小程序
  • 2017 Multi-University Training Contest 2 hdu 6047
  • TSX数据Skysense PS最简操作流程和处理结果视频
  • Java开发者必备的六款工具
  • Android笔记(预安装APK)
  • 14种排序算法和PHP数组
  • TYVJ1340 送礼物
  • 多线程面试
  • 加样针
  • MVC项目中使用百度地图
  • BZOJ1293 [SCOI2009]生日礼物 离散化
  • spring中bean 的属性id与name
  • 今日练习题整理
  • Wincc flexable的局势视图的组态
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 2019年如何成为全栈工程师?
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • bearychat的java client
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • js面向对象
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spring boot下thymeleaf全局静态变量配置
  • TCP拥塞控制
  • Terraform入门 - 1. 安装Terraform
  • Vim Clutch | 面向脚踏板编程……
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • windows下mongoDB的环境配置
  • 回顾2016
  • 小程序button引导用户授权
  • 一个完整Java Web项目背后的密码
  • ###STL(标准模板库)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (10)STL算法之搜索(二) 二分查找
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (done) 两个矩阵 “相似” 是什么意思?
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (六)激光线扫描-三维重建
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Micro Framework初体验
  • .NET大文件上传知识整理
  • [ 第一章] JavaScript 简史
  • [20150629]简单的加密连接.txt
  • [51nod1610]路径计数
  • [C#]C#学习笔记-CIL和动态程序集
  • [C/C++]数据结构 堆的详解
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [ffmpeg] av_opt_set 解析
  • [Flutter]WindowsPlatform上运行遇到的问题总结