第一题:
题目描述:
有一台损坏的打地鼠机器,有3*3个地鼠洞,
机器启动,会随机起来任意位置的地鼠(起来1-9只地鼠都有可能),
但是打地鼠机现在出现了bug,打冒头的地鼠后,这只地鼠上下左右的地鼠一定会变化(起来的地鼠要下去,没起来的地鼠要起来)
如何在机器启动后,使用最少的步骤将所有的地鼠都‘敲’下去?
如果可以全部敲下去,那么输出使用的最少次数;如果不可以全部敲下去,那么输出‘-1’。
输入描述:
输入三行0,1数据;0表示这个位子地鼠潜藏在洞中,1表示这个位子的地鼠伸出脑袋,例如
1,1,0
0,0,1
0,0,1
输出描述:输出需要的最少步数(举一反三:这里可以增加难度输出需要敲击的地鼠洞位子)
输入样例1:
1,1,0 0,0,1 0,0,1
输出样例1:2
可选输出样例1:
0,1,0 0,0,1 0,0,0
输入样例2:
1,1,1 1,1,1 1,1,1
输出样例2:5
可选输出样例2:
1,0,1 0,1,0 1,0,1
输入样例3:
0,0,0
0,0,0
0,0,0
输出样例3:-1
可选输出样例3:
由于没有地鼠冒头无法执行敲击
系统本身就是我们想要的全部潜入地洞状态
输入样例4:
0,1,0 1,0,1 0,1,0
输出样例4:4
可选输出样例4:
0,1,0 1,0,1 0,1,0
处理程序1:
方法一 遍历计算
将所有的可能出现的状况先计算出来,之后对原始的模型进行查找表查找对应的结果
1 import copy 2 from itertools import combinations 3 4 # *** 辅助函数 *** # 5 INDEX_DICT = {0: [0, 1, 3], 1: [0, 1, 2, 4], 2: [1, 2, 5], # 选定节点,变换节点 6 3: [0, 3, 4, 6], 4: [1, 3, 4, 5, 7], 5: [2, 4, 5, 8], 7 6: [3, 6, 7], 7: [4, 6, 7, 8], 8: [5, 7, 8]} 8 graph_zeros = [0 for i in range(9)] 9 graph_index = [i for i in range(9)] 10 11 12 def graph2run(graph, index): # 选择一个位置点进行其他位置的取反运行 13 for i in INDEX_DICT[index]: 14 if graph[i]: 15 graph[i] = 0 16 else: 17 graph[i] = 1 18 return graph 19 20 21 def list2bin(graph): # 将数组转看成二进制字符串 22 str_ = '' 23 str_ = str_.join(map(str, graph)) 24 return str_ 25 26 27 def LIST2bin(LIST): 28 d1 = [0 for i in range(9)] 29 for i in LIST: 30 d1[i] += 1 31 d2 = '' 32 d2 = d2.join(map(str, d1)) 33 return d2 34 35 # *** 数据输入 *** # 36 graph = [] 37 for i in range(3): 38 graph.extend(list(map(int, input().split(',')))) 39 graph = list2bin(graph) 40 41 42 # *** 数据预处理 *** # 43 # 方法1 遍历计算 44 # 高时间复杂度,每次起手都需要计算一遍 45 MODE0_LIST = [] 46 graph_result = {} 47 for i in range(1, 10): # ① 获得需要敲击的位点 48 LIST = list(combinations(graph_index, i)) 49 for j in LIST: 50 MODE0_LIST.append([x for x in j]) 51 52 for i in MODE0_LIST: # ② 对需要敲击的位点list进行遍历 53 graph_mid = copy.deepcopy(graph_zeros) 54 for j in i: 55 graph_mid = graph2run(graph_mid, j) 56 num = list2bin(graph_mid) 57 d1 = copy.deepcopy(graph_zeros) 58 for j in i: 59 d1[j] += 1 60 graph_result[num] = list2bin(d1) 61 # print(graph_result) 62 graph_result['000000000'] = '000000000' # 添加全零这种异常情况 63 str_out = graph_result[graph] 64 knock_index = list(str_out) 65 step_num = sum([int(x) for x in knock_index]) 66 67 # *** 数据输出 *** # 68 if step_num == 0: 69 print(-1) 70 print('由于没有地鼠冒头无法执行敲击\n系统本身就是我们想要的全部潜入地洞状态') 71 else: 72 print(step_num) 73 for i in range(3): 74 print(','.join(knock_index[i*3:(i+1)*3]))
备注:这个程序中使用函数库copy、combinations
处理程序2:
方法二 查找表
将方法一种的字典以字典数据的形式直接存在程序中或者文件中,每次直接读取查找即可
1 # *** 辅助函数 *** # 2 # 计算后图谱结果-key:地鼠模型;value:需要的最少步数;另外添加0这个没有地鼠冒头的情况key=0,value=-1 3 graph_result = {'010101010':'010101010','000001101':'001011100','000110111':'001011011','100001101':'100010010', 4 '010000011':'100100010','011111010':'101110011','000101000':'101101101','110001010':'110111101', 5 '101111101':'010010010','000110001':'000000110','000010100':'100110111','101001101':'001110001', 6 '111000110':'001100111','000100110':'000000100','000111100':'001011010','001010010':'000001001', 7 '011000010':'010100100','001111100':'100111001','111100000':'001100011','010001111':'110011011', 8 '110100001':'111100101','111110010':'100001001','011000110':'100101001','110111101':'111100110', 9 '111101101':'000111111','100010010':'000100100','110101000':'000110100','011111000':'010100011', 10 '110011110':'010001010','101001011':'000101100','100011011':'111110101','000111011':'011100010', 11 '100010011':'011000001','100010110':'110101001','100101010':'111110011','111011000':'110110100', 12 '101100101':'100011100','010111011':'011110101','010100111':'011110110','000010010':'101101010', 13 '100111110':'011000100','101001111':'110100001','100111011':'110101100','010011100':'000010100', 14 '110000101':'000110001','110011011':'111100010','001001100':'111011010','101111111':'101000010', 15 '010111000':'111000000','001011011':'111011000','011000100':'011111001','001011010':'100111101', 16 '101110011':'111111011','101111010':'000101010','111010110':'011011101','010000110':'001001010', 17 '001100000':'100111010','110010110':'110111110','101101110':'100011101','011101111':'010100001', 18 '101110101':'110100110','100001001':'010011111','111110111':'001100001','100110010':'001111101', 19 '111111011':'011011000','100000111':'111110110','111001110':'101010011','000001010':'011100100', 20 '001110010':'001010000','110001100':'111100000','010001100':'010101110','111110110':'010000100', 21 '100101001':'011000110','011010001':'100101011','101110111':'001110110','101001010':'011001001', 22 '100101000':'000100011','011110001':'101110010','111001011':'000111011','000110100':'101101110', 23 '000100001':'010111100','001001101':'100111111','100001110':'000100111','011000011':'001000001', 24 '110010101':'010001011','000000010':'111010000','111000000':'000111010','001001011':'101100010', 25 '100100111':'110101111','110101111':'010001100','010110011':'111000001','001110000':'110000000', 26 '100011100':'101001101','100100101':'001111111','100000011':'001111011','100110001':'101001000', 27 '010011000':'110011001','111101110':'100001010','001010000':'111011001','110010011':'011010110', 28 '011011010':'100101010','001101011':'100111011','101000000':'000101101','111010101':'111101000', 29 '000000001':'011100101','101111011':'011001111','111101011':'001100010','111100010':'110110011', 30 '101000011':'100011000','000101001':'110001000','101100100':'111111001','100101110':'001111110', 31 '111001001':'111101011','000000111':'010111000','011101011':'100101100','110100011':'000110101', 32 '111010000':'010000000','110011111':'001101111','011010111':'101110110','101010001':'001110010', 33 '001011001':'000001000','010101101':'000010010','011110100':'000011010','110111000':'010001110', 34 '110001111':'011010101','011010110':'110010011','010000001':'011110010','001100011':'000001111', 35 '111011001':'101010001','001111101':'111011100','110011001':'000110010','101100001':'010010001', 36 '100111001':'001111100','010011011':'010101100','000111111':'101101111','011001011':'101110101', 37 '110101110':'001101001','100100100':'010011010','100011111':'001111000','100001100':'111110111', 38 '110100101':'001101000','100010001':'100010001','101101000':'101000000','011111110':'011111110', 39 '100101111':'010011011','101101001':'110100101','001110110':'111011101','001101010':'111011110', 40 '000101011':'001011000','001001110':'000001010','111001010':'011011110','110111110':'011010011', 41 '011001111':'011111000','101111000':'111111010','110010100':'001101110','000101010':'010111101', 42 '110101101':'101011100','110011000':'011010111','010000100':'110011010','111111000':'111101101', 43 '101010010':'101000111','111111001':'100001000','111000111':'010000010','001100110':'101100111', 44 '111110100':'101010100','010110110':'010101001','011100000':'100101101','101010111':'000101111', 45 '101000101':'101000101','010010110':'011110000','010000000':'000010111','101000010':'111111101', 46 '011100011':'000011000','000011100':'000000011','101110100':'101000011','101011111':'100011011', 47 '000111110':'110001010','010001101':'001001011','100000001':'110101011','010111101':'010101000', 48 '011000001':'110010001','010010111':'000010101','101010100':'100011010','111000011':'100001111', 49 '011001101':'100101000','101101111':'111111000','010011101':'011110001','111010100':'100001101', 50 '000110011':'111010110','100100011':'000100010','010011001':'101111100','000101110':'100110000', 51 '111111110':'110110000','111010011':'110110101','001110100':'000001101','000010110':'011100111', 52 '100110011':'010011000','001101111':'010110110','001000011':'001010110','011001010':'110010000', 53 '010110100':'101111001','101111100':'001110111','100100001':'111110010','110000010':'010001001', 54 '000110101':'110001011','001001111':'011101111','100000000':'101001110','000010001':'001011111', 55 '010100010':'110011110','100100110':'101001010','011010100':'001000011','000011101':'011100110', 56 '010100110':'000010011','010001110':'101111110','110001011':'101011000','011011100':'101110111', 57 '001001000':'001010111','010111100':'001001101','100011001':'000100101','001001010':'110000111', 58 '011001110':'000011101','111100100':'111101110','110101100':'110111001','111011011':'010000001', 59 '001110001':'101100101','010110001':'000010001','001111001':'001010001','111101000':'101010111', 60 '010101110':'100100111','110110100':'000110111','100000110':'100010011','100110111':'100010101', 61 '001010111':'101100001','011100010':'011111101','100111000':'010011001','101001000':'100011001', 62 '011100001':'111001000','001111011':'110000001','011101001':'011111100','111010010':'101010000', 63 '111011110':'111101001','001111000':'010110100','000001100':'010111001','000000101':'101101000', 64 '010101011':'001001111','111011100':'000111001','010100100':'111000011','101101100':'011001101', 65 '001000101':'000001011','011111001':'001000110','111000001':'011011111','001001001':'010110010', 66 '110110101':'011010010','110110110':'111100111','010100001':'010101011','010101100':'011110111', 67 '111110011':'111101100','110110010':'001101010','101001110':'101000100','110111010':'101011110', 68 '000010011':'110001111','110111111':'000110110','001111110':'011101001','110000001':'110111100', 69 '100111111':'000100001','110011010':'100000111','011110011':'010100010','110100000':'100000000', 70 '001110101':'011101000','001000010':'010110011','010000101':'101111111','010010000':'010101101', 71 '110011101':'110111111','010001011':'000010110','011001000':'001000000','000111001':'100110010', 72 '010001010':'011110011','110100111':'110111000','100110110':'111110000','001101101':'101100110', 73 '100100010':'011000111','100011101':'110101000','100000100':'011000011','001100001':'111011111', 74 '000100000':'001011001','010111110':'110011101','111100001':'010000110','101011001':'101000110', 75 '101001001':'111111100','100111101':'111110001','111101111':'111101111','000001000':'100110100', 76 '111100111':'011011011','010010010':'101111101','111100110':'000111110','100110000':'110101101', 77 '110001000':'001101101','000000110':'001011101','010110010':'100100100','001011100':'101100000', 78 '010101000':'101111010','111011111':'100001100','110101010':'111100100','101100111':'011001100', 79 '011000101':'000011100','001111010':'101100100','110001110':'000110000','110100010':'011010000', 80 '110000111':'111100001','001000100':'011101110','101000100':'110100000','100111100':'100010100', 81 '010100011':'101111011','011010010':'000011110','000011000':'110001110','101111001':'100011111', 82 '001101000':'000001110','001011111':'001010101','011010101':'010100110','011010000':'111001110', 83 '000100011':'101101100','001010001':'100111100','011101000':'000011001','010010101':'111000101', 84 '111000100':'110110111','010011111':'100100001','111100101':'100001011','110000000':'101011001', 85 '011101100':'110010100','101010011':'110100010','100001000':'001111010','011000111':'111001100', 86 '001100111':'110000010','011010011':'011111011','110100110':'101011101','000010101':'111010010', 87 '110001001':'010001000','101100010':'110100100','000001011':'000000001','010011010':'001001001', 88 '000011110':'111010011','101110110':'010010011','001000111':'111011011','101001100':'010010100', 89 '010010001':'001001000','000110010':'100110011','101100011':'101000001','110010010':'000110011', 90 '000001110':'101101001','101110000':'011001110','100010101':'010011100','101011010':'001110011', 91 '110111011':'110111011','010100101':'100100110','100010000':'111110100','000011010':'001011110', 92 '110101011':'100000001','001010101':'010110001','011111100':'100101110','001011110':'010110000', 93 '000101101':'000000101','100001010':'110101010','101100110':'000101001','001100101':'001010010', 94 '011011001':'000011111','000100101':'100110001','000110110':'010111110','001011101':'110000101', 95 '111000101':'101010010','110111001':'001101011','101110010':'100011110','011100100':'010100000', 96 '011001100':'111001101','000100111':'011100001','100000010':'010011110','110010000':'111100011', 97 '101101011':'001110101','011110010':'001000111','011111011':'110010110','101101010':'010010000', 98 '100011000':'011000000','111111111':'101010101','011000000':'101110100','101011100':'000101110', 99 '001110111':'100111000','011011111':'001000010','011101110':'001000100','010001000':'100100011', 100 '101100000':'001110100','010010011':'110011000','110110011':'010001111','011110000':'110010111', 101 '101010000':'010010111','101000110':'001110000','001010100':'001010100','010110111':'001001100', 102 '100101100':'110101110','110011100':'101011010','111101100':'011011010','111011010':'001100100', 103 '011100110':'101110000','010001001':'111000110','001011000':'011101101','101111110':'110100111', 104 '011100111':'110010101','111010111':'000111000','100111010':'101001001','100101011':'100010110', 105 '011111111':'000011011','110111100':'100000011','100001111':'011000010','111000010':'111101010', 106 '101101101':'000101000','100010111':'101001100','100101101':'101001011','110000110':'100000100', 107 '110001101':'100000101','000001001':'111010001','011011011':'111001111','100100000':'100010111', 108 '000111101':'010111111','011011101':'110010010','000000100':'110001101','101011011':'010010110', 109 '011100101':'001000101','001101001':'011101011','101000001':'011001000','010111010':'000010000', 110 '110100100':'010001101','010101111':'111000010','100110100':'000100000','111111100':'001100000', 111 '111101001':'110110010','100110101':'011000101','111111101':'010000101','010011110':'111000100', 112 '011101010':'111001001','000011111':'100110110','101010101':'111111111','000100100':'111010100', 113 '110010001':'100000110','000010111':'000000010','101011000':'110100011','111101010':'010000111', 114 '000111000':'111010111','111100011':'101010110','100010100':'001111001','001100010':'011101010', 115 '111001000':'100001110','000011011':'010111011','001000000':'101100011','011011000':'011111010', 116 '000000011':'100110101','000100010':'110001001','110110001':'101011111','001110011':'010110101', 117 '010000010':'111000111','011001001':'010100101','000101111':'111010101','001100100':'010110111', 118 '101110001':'000101011','001101110':'001010011','111001111':'110110110','100011110':'010011101', 119 '011110101':'011111111','101011110':'111111110','110101001':'011010001','101011101':'011001011', 120 '010101001':'110011111','100000101':'000100110','000110000':'011100011','010100000':'001001110', 121 '111110101':'110110001','010010100':'100100000','010110000':'011110100','000011001':'101101011', 122 '110110111':'100000010','111010001':'001100101','001000001':'110000110','101010110':'011001010', 123 '111001100':'010000011','010111111':'101111000','001000110':'100111110','110010111':'101011011', 124 '000010000':'010111010','011110110':'111001010','001101100':'110000011','111110000':'011011001', 125 '011111101':'111001011','000101100':'011100000','111110001':'000111100','001111111':'000001100', 126 '011110111':'100101111','111111010':'000111101','100001011':'101001111','100011010':'100010000', 127 '000001111':'110001100','010110101':'110011100','111001101':'001100110','110000011':'001101100', 128 '110000100':'011010100','011011110':'010100111','011101101':'101110001','001010110':'110000100', 129 '001010011':'011101100','101000111':'010010101','110110000':'110111010','010111001':'100100101', 130 '010000111':'010101111','000111010':'000000111','111011101':'011011100','000000000':'000000000'} 131 132 133 def list2bin(graph): # 将数组转看成二进制字符串 134 str_ = '' 135 str_ = str_.join(map(str, graph)) 136 return str_ 137 138 139 # *** 数据输入 *** # 140 graph = [] 141 for i in range(3): 142 graph.extend(list(map(int, input().split(',')))) 143 graph = list2bin(graph) 144 145 146 # *** 数据预处理 *** # 147 # 方法2 查找表方法 148 # 以字典数据的形式直接存在程序中或者文件中,每次直接读取查找即可 149 str_out = graph_result[graph] 150 knock_index = list(str_out) 151 step_num = sum([int(x) for x in knock_index]) 152 153 154 # *** 数据输出 *** # 155 if step_num == 0: 156 print(-1) 157 print('由于没有地鼠冒头无法执行敲击\n系统本身就是我们想要的全部潜入地洞状态') 158 else: 159 print(step_num) 160 for i in range(3): 161 print(','.join(knock_index[i*3:(i+1)*3]))
第二题:
题目描述:
有一篇无边界的海洋,海洋里分布着若干个小岛,这些小岛通过单向桥连接。
每座小岛上有探路机器人,根据外部指令,按照指定的模式经过单向桥向外探索路径。
为了降低复杂度,命令通过字符串表示,由三个字母组成,每个字母可以从A、B、C中任意选择,这些字母只用于判断路径上的小岛是否相同,无其他排序等任何含义。
探路机器人在寻找模式的路径时,同一条路径的小岛可以重复,但是单向桥不可重复。
探路机器人完成一条路径探索后,自动返回起点岛屿重新探索路径,直到所有满足模式的路径探索完成为止。
例如存在以下的小岛和单向桥,有向边为单向桥
模式命令AAB或者BBC等命令等价,可以获得1,E1,1E3,2、1,E1,1,E4,2、1,E2,1、1,E2,1E4,2 共4条路径;
模式命令BBB或者CCC等命令等价,可以获得1,E1,1,E2,1、1,E2,1,E1,1 共2条路径;
模式命令ABC或者CBA或者BAC等命令等价,可以获得1,E4,2,E7,4、1,E3,3,E6,5、1,E3,3,E6,5、3,E5,2,E7,4 共4条路径。
根据指定的输入,请计算所有机器人一共能探索出多少条不同的路径。
输入描述:
① 先输入一个N,表示N条单向桥
② 在连续输入N个单向桥的信息,输入格式为 1,E3,3 (其中1和3表示小岛的名称,E3表示单向桥的名称,意义E3单向桥由小岛1指向小岛3)
③ 输入模式命令,例如AAA,AAB
输入样例1:
7
1,E1,1
1,E2,1
1,E3,3
1,E4,2
3,E5,2
3,E6,5
2,E7,4
AAA 输出样例1:2
AAB 输出样例1:4
ABA 输出样例1:0
BAA 输出样例1:0
ACB 输出样例1:4
处理程序:
1 # *** 辅助函数 *** # 2 def AMN_Math(M, N): # M 基底、 N 子数 3 t0, t1 = 1, 1 4 for i in range(1, M + 1): 5 t0 *= i 6 for i in range(1, M - N + 1): 7 t1 *= i 8 return int(t0 / t1) 9 10 11 # *** 数据输入 *** # 12 NODESPACE = [] 13 ROADSPACE = [] 14 N = int(input()) 15 d0 = [] 16 for i in range(N): 17 d_mid = list(input().split(',')) 18 d_mid[0] = int(d_mid[0]) 19 d_mid[2] = int(d_mid[2]) 20 if d_mid[0] not in NODESPACE: 21 NODESPACE.append(d_mid[0]) 22 23 if d_mid[1] not in ROADSPACE: 24 ROADSPACE.append(d_mid[1]) 25 26 if d_mid[2] not in NODESPACE: 27 NODESPACE.append(d_mid[2]) 28 d0.append(d_mid) 29 ABC = input() 30 31 32 # *** 数据处理 *** # 33 # ① 将命令解析 34 if ABC[0] == ABC[1] and ABC[1] == ABC[2]: # AAA 35 order = 0 36 elif ABC[0] == ABC[1] and ABC[1] != ABC[2]: # AAB 37 order = 1 38 elif ABC[0] == ABC[2] and ABC[1] != ABC[2]: # ABA 39 order = 2 40 elif ABC[0] != ABC[1] and ABC[1] == ABC[2]: # BAA 41 order = 3 42 else: 43 order = 4 44 45 graph = [[0 for x in range(len(NODESPACE))] for x in range(len(NODESPACE))] 46 for i in range(N): 47 x, y = d0[i][0] - 1, d0[i][2] - 1 48 graph[x][y] += 1 49 50 # ③ 执行探路过程 51 sum = 0 52 state = 0 53 if order == 0: # aaa 正确 54 for i in range(len(NODESPACE)): 55 if graph[i][i] == 2: 56 sum += 2 57 elif graph[i][i] > 2: 58 sum += AMN_Math(graph[i][i], 2) 59 60 elif order == 1: # aab 正确 61 for i in range(len(NODESPACE)): 62 sum_mid = 0 63 if graph[i][i] >= 1: 64 sum_mid += graph[i][i] 65 state = 1 66 67 if state: # 再寻找一个节点即可 68 for j in range(len(NODESPACE)): 69 if j == i: # 如果相同就跳出本次循环 70 continue 71 sum += sum_mid * graph[i][j] 72 73 elif order == 2: # aba 正确 74 for i in range(len(NODESPACE)): 75 sum_mid = 0 76 for j in range(len(NODESPACE)): 77 if i == j: # 直接跳过内循环节点 78 continue 79 if graph[i][j] >= 1: 80 sum_mid = graph[i][j] 81 sum += sum_mid*graph[j][i] 82 83 elif order == 3: # baa 正确 84 for i in range(len(NODESPACE)): 85 sum_mid = 0 86 for j in range(len(NODESPACE)): 87 if i == j: # 直接跳过内循环节点 88 continue 89 if graph[i][j] >= 1: 90 sum_mid = graph[i][j] 91 sum += sum_mid * graph[j][j] 92 93 elif order == 4: # abc 94 for i in range(len(NODESPACE)): 95 sum_mid = 0 96 for j in range(len(NODESPACE)): 97 if i == j: # 跳出内循环 98 continue 99 if graph[i][j] >= 1: 100 sum_mid = graph[i][j] 101 for k in range(len(NODESPACE)): 102 if k == i or k == j: # 如果节点重复跳出本次循环 103 continue 104 sum += sum_mid*graph[j][k] 105 106 print(sum) 107 108 ''' 109 输入样例1: 110 7 111 1,E1,1 112 1,E2,1 113 1,E3,3 114 1,E4,2 115 3,E5,2 116 3,E6,5 117 2,E7,4 118 AAB 119 输出样例1:4 120 '''