PHP算经济学习(拾1)

1.King and Queen

注明:像国际象棋那样的玩乐算法编制程序有多个首要任务:

一.评估地方,检查哪些部分能够走;

二.构造1种十分小的算法来抉择移动到最优值的义务。

让大家先来消除一个简约的题材:有3个棋盘,有八 x
7个方格。上面有士林蓝的君主和法国红的水晶室女。检查女帝是不是能吃掉国王。

水晶室女能够垂直、水平的或沿任何三个对角线移动到其它偏离。

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则呈现了女帝的例外职位。

在左手的棋盘中,太岁能够被多少个女皇中的任何二个“吃掉”;

在不利的棋盘中,皇帝处于安全的地点——三个女帝中从未1个能吃掉她。

输入数据:第一行中带有测试用例数。

上面一行描述每一种test_case的天骄和皇后的岗位,通过点名它们的方框(圣上是第二个)。

答案:每1个测试给出1个字母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),所以有不可缺少学习1些灵光的算法。

用下列符号来描述卡片:

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张牌,所以在洗牌此前,它们应该被放入5一个要素的数组中。该数组的伊始顺序如下:1三张红绿梅牌,一叁张方块牌,一3张红心牌,最终壹三张黑桃牌。各个花色卡的其中都以由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,并为它生成随机值一5,这表示该卡应该移动到岗位一5,D叁在那里,D三应该被移回地点0。然后大家从岗位第11中学收取C二然后生成下多少个私行数50,所以C二和平方调换。等等。

您将会获得一个非负整数随机数字的类别——如若它们大于须要的数字,那么就把它们调整到必要的限制,取5二的模数。

输入数据:将涵盖5贰个非负整数,您应该使用它们来像描述的那样举行洗牌。

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

例如:

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

 

相关文章