北民大人工智能作业,其他相关作业资料和问题可留言交流
  这里没有用课本上的open表和close表的方式,这个问题完全可以看图找规律解出来,而且三个代码(广度、A、A*)没有多少区别,代码相似度极高,将每个操作步骤抽成方法后A和A*就只有一个入队规则不一样而已,广度就是直接去掉这个规则。

  这里的规律就是根据课本上给出的启发公式(格式为F=A+B;A是棋盘所在的深度;B在A算法中是不在位的元素个数,在A*算法中就是所有元素要移动的步数和)来设计入队规则,因为同一层上的棋盘一起考虑,所以落实到代码中A部分的深度属性就没用了,因为同一层上的这个参数都是一样的,只需考虑参数B就行。另外就是从第二层上的棋盘开始,往下的分支会出现它父节点的父节点棋盘状态,这个要剔除掉,否则会陷入无限的循环当中。

  关于自己代码的评价:优点是便于理解,更贴合初学者或者是没有参考课本思路的人的想法;个人觉得比课本上的open表close表的方式要简单的多,其次目前A和A算法运行效率要比网上用open、close表的代码强非常多。缺点是:在最初的设想时没有考虑周全,棋盘的表示已经确定,但是发现棋盘分支会出现它父节点的父节点棋盘状态时,想用回溯的方法就需要大的改动,所以干脆用一个列表存储所有出现过的棋盘,后续棋盘状态不允许出现列表中已有的棋盘,以此来回避回溯问题,这就带来了效率上的漏洞,A和A因为有入队条件限制,所以感觉不出问题,但是放到广度算法里边,有些棋盘状态的演算,跑了14个小时依然没有结果,这个问题回随着演算步骤的加深疯狂的放大。解决办法自然是使用回溯方式,为每个棋盘增加一个父节点属性,用来存储父棋盘,每次只要根据棋盘的父节点属性找到上两步的棋盘与之对比即可,就无需比对所有出现过的棋盘了。

  这里先给出三个实现代码,下边再附上课本上的三幅图已经这三个代码大致的流程走向图。

广度算法

import numpy as np
import copy
import time"""
1. 空洞用数字0表示,其他各个位置用1...8表示
2. 同一层deep都一样,所以直接不考虑
3. 注意深浅拷贝问题
4. 注意闭包问题
5. 注意stack不是栈,是队列queue,temp是step代表步数,懒得改了
6. print("this state no answer!")已经没用了,最初是验证是否会出现没解的情况,现在有了judge_have_answer()方法
7. 使用规则:输入初始和最终棋盘元素,横着从左到右挨着输入,空洞为0,其他为1...8
8. 注意日期打印时.format()方式不能使用
"""final_checkerboard = np.zeros((3, 3), dtype=int)  # 记录最终的棋盘状态
total_stack = []
final_stack = []
mid_stack = []
step = 0
start_time = 0def create_checkerboard(checkerboard):order = 0for i in range(3):for j in range(3):order += 1element = int(input("请输入第{}个数:".format(order)))checkerboard[i][j] = elementdef move_checkerboard(before_state):global mid_stack# 首先确定空洞的位置position = np.argwhere(before_state == 0)first_position = position[0][0]second_position = position[0][1]if first_position == 0:if second_position == 0:zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif second_position == 2:youyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif first_position == 2:if second_position == 0:xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)elif second_position == 2:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)else:if second_position == 0:zuoyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif second_position == 2:xiayi(before_state, first_position, second_position)youyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)def equal_all_position(first_checkerboard):for t in total_stack:num = 0for i in range(3):for j in range(3):if first_checkerboard[i][j] == t[i][j]:num += 1if num == 9:return 0else:passreturn 1def shangyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position + 1][second_position]  # 数字上移after_state[first_position + 1][second_position] = 0tap = equal_all_position(after_state)if tap:statistics(after_state)  # 这里保留是为了判断是否达到最终状态ruzhan(after_state)def xiayi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position -1][second_position]  # 数字下移after_state[first_position - 1][second_position] = 0tap = equal_all_position(after_state)if tap:statistics(after_state)ruzhan(after_state)def zuoyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position][second_position + 1]  # 数字左移after_state[first_position][second_position + 1] = 0tap = equal_all_position(after_state)if tap:statistics(after_state)ruzhan(after_state)def youyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position][second_position - 1]  # 数字右移after_state[first_position][second_position - 1] = 0tap = equal_all_position(after_state)if tap:statistics(after_state)ruzhan(after_state)def ruzhan(checkerboard):global mid_stackglobal stepstep += 1print(step)mid_stack.append(checkerboard)total_stack.append(checkerboard)print(checkerboard)print("====================")# 用来统计当前棋盘有多少个元素不在目标位置
def statistics(checkboard):number = 0for i in range(3):for j in range(3):if checkboard[i][j] == final_checkerboard[i][j]:number += 1if number == 9:print("最终结果为:")print(checkboard)end_time = time.time()print("end_time=",end_time)global start_timeprint("用时=",end_time - start_time)exit()return 9 - numberdef iterator_all_elements(final_stack):for i in final_stack:move_checkerboard(i)# 这里的教训告诉我们没事不要瞎用不熟悉的库,最后还是numpy转list
def judge_have_answer(initial_checkerboard):initial_checkerboard_result = 0final_checkerboard_result = 0initial_checkerboard_backup = copy.deepcopy(initial_checkerboard)final_checkerboard_backup = copy.deepcopy(final_checkerboard)new_initial = initial_checkerboard_backup.reshape((1,9)).tolist()[0]new_final = final_checkerboard_backup.reshape((1,9)).tolist()[0]new_initial.remove(0)new_final.remove(0)for i in range(8):for j in range(i):if new_initial[j] > new_initial[i]:initial_checkerboard_result += 1for i in range(8):for j in range(i):if new_final[j] > new_final[i]:final_checkerboard_result += 1return initial_checkerboard_result, final_checkerboard_resultdef main():initial_checkerboard = np.zeros((3, 3), dtype=int) #记录初始的棋盘状态print("空棋盘如下:")print(initial_checkerboard)print("请输入初始状态棋盘数据:")create_checkerboard(initial_checkerboard)print("初始棋盘状态如下:")print(initial_checkerboard)print("请输入终止状态棋盘数据:")create_checkerboard(final_checkerboard)print("最终棋盘状态如下:")print(final_checkerboard)print("-------------------")number1, number2 = judge_have_answer(initial_checkerboard)if (number1 % 2) != (number2 % 2):print("该起始状态无法达到最终状态!")exit()global start_timestart_time = time.time()print("start_time=", start_time)statistics(initial_checkerboard)global final_stackglobal mid_stackmid_checkerboard = copy.deepcopy(initial_checkerboard)final_stack.append(mid_checkerboard)total_stack.append(mid_checkerboard)while(len(final_stack) != 0):iterator_all_elements(final_stack)final_stack = copy.deepcopy(mid_stack)mid_stack = []print("this state no answer!")if __name__ == '__main__':main()

A算法

import numpy as np
import copy"""
1. 空洞用数字0表示,其他各个位置用1...8表示
2. 同一层deep都一样,所以直接不考虑
3. 注意深浅拷贝问题
4. 注意闭包问题
5. 注意stack不是栈,是队列queue,temp是step代表步数,懒得改了
6. print("this state no answer!")已经没用了,最初是验证是否会出现没解的情况,现在有了judge_have_answer()方法
7. 使用规则:输入初始和最终棋盘元素,横着从左到右挨着输入,空洞为0,其他为1...8
"""final_checkerboard = np.zeros((3, 3), dtype=int)  # 记录最终的棋盘状态
min_element_number = 0
total_stack = []
final_stack = []
mid_stack = []
temp = 0def create_checkerboard(checkerboard):order = 0for i in range(3):for j in range(3):order += 1element = int(input("请输入第{}个数:".format(order)))checkerboard[i][j] = elementdef move_checkerboard(before_state):# 首先确定空洞的位置position = np.argwhere(before_state == 0)first_position = position[0][0]second_position = position[0][1]if first_position == 0:if second_position == 0:zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif second_position == 2:youyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif first_position == 2:if second_position == 0:xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)elif second_position == 2:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)else:if second_position == 0:zuoyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif second_position == 2:xiayi(before_state, first_position, second_position)youyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)def equal_all_position(first_checkerboard):for t in total_stack:num = 0for i in range(3):for j in range(3):if first_checkerboard[i][j] == t[i][j]:num += 1if num == 9:return 0else:passreturn 1def shangyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position + 1][second_position]  # 数字上移after_state[first_position + 1][second_position] = 0tap = equal_all_position(after_state)if tap:number = statistics(after_state)ruzhan(after_state, number)def xiayi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position -1][second_position]  # 数字下移after_state[first_position - 1][second_position] = 0tap = equal_all_position(after_state)if tap:number = statistics(after_state)ruzhan(after_state, number)def zuoyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position][second_position + 1]  # 数字左移after_state[first_position][second_position + 1] = 0tap = equal_all_position(after_state)if tap:number = statistics(after_state)ruzhan(after_state, number)def youyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position][second_position - 1]  # 数字右移after_state[first_position][second_position - 1] = 0tap = equal_all_position(after_state)if tap:number = statistics(after_state)ruzhan(after_state, number)def ruzhan(checkerboard,number):global mid_stackglobal min_element_numberif len(mid_stack) == 0:mid_stack.append(checkerboard)total_stack.append(checkerboard)min_element_number = numberelse:if number > min_element_number:print("未插入")elif number == min_element_number:mid_stack.append(checkerboard)total_stack.append(checkerboard)min_element_number = numberelif number < min_element_number:mid_stack = []mid_stack.append(checkerboard)total_stack.append(checkerboard)min_element_number = numberprint(checkerboard)print("====================")# 用来统计当前棋盘有多少个元素不在目标位置
def statistics(checkboard):number = 0for i in range(3):for j in range(3):if checkboard[i][j] == final_checkerboard[i][j]:number += 1if number == 9:print("最终结果为:")print(checkboard)exit()return 9 - numberdef iterator_all_elements(final_stack):for i in final_stack:move_checkerboard(i)# 这里的教训告诉我们没事不要瞎用不熟悉的库,最后还是numpy转list
def judge_have_answer(initial_checkerboard):initial_checkerboard_result = 0final_checkerboard_result = 0initial_checkerboard_backup = copy.deepcopy(initial_checkerboard)final_checkerboard_backup = copy.deepcopy(final_checkerboard)new_initial = initial_checkerboard_backup.reshape((1,9)).tolist()[0]new_final = final_checkerboard_backup.reshape((1,9)).tolist()[0]new_initial.remove(0)new_final.remove(0)for i in range(8):for j in range(i):if new_initial[j] > new_initial[i]:initial_checkerboard_result += 1for i in range(8):for j in range(i):if new_final[j] > new_final[i]:final_checkerboard_result += 1return initial_checkerboard_result, final_checkerboard_resultdef main():initial_checkerboard = np.zeros((3, 3), dtype=int) #记录初始的棋盘状态print("空棋盘如下:")print(initial_checkerboard)print("请输入初始状态棋盘数据:")create_checkerboard(initial_checkerboard)print("初始棋盘状态如下:")print(initial_checkerboard)print("请输入终止状态棋盘数据:")create_checkerboard(final_checkerboard)print("最终棋盘状态如下:")print(final_checkerboard)print("-------------------")number1, number2 = judge_have_answer(initial_checkerboard)if (number1 % 2) != (number2 % 2):print("该起始状态无法达到最终状态!")exit()statistics(initial_checkerboard)global final_stackglobal mid_stackmid_checkerboard = copy.deepcopy(initial_checkerboard)final_stack.append(mid_checkerboard)total_stack.append(mid_checkerboard)global tempwhile(len(final_stack) != 0):temp += 1iterator_all_elements(final_stack)final_stack = copy.deepcopy(mid_stack)mid_stack = []print("this state no answer!")if __name__ == '__main__':main()

A*算法

import numpy as np
import copy"""
1. 空洞用数字0表示,其他各个位置用1...8表示
2. 同一层deep都一样,所以直接不考虑
3. 注意深浅拷贝问题
4. 注意闭包问题
5. 注意stack不是栈,是队列queue,temp是step代表步数,懒得改了
6. print("this state no answer!")已经没用了,最初是验证是否会出现没解的情况,现在有了judge_have_answer()方法
7. 使用规则:输入初始和最终棋盘元素,横着从左到右挨着输入,空洞为0,其他为1...8
"""final_checkerboard = np.zeros((3, 3), dtype=int)  # 记录最终的棋盘状态
min_element_number = 0
total_stack = []
final_stack = []
mid_stack = []
temp = 0
total_step = 0def create_checkerboard(checkerboard):order = 0for i in range(3):for j in range(3):order += 1element = int(input("请输入第{}个数:".format(order)))checkerboard[i][j] = elementdef move_checkerboard(before_state):# 首先确定空洞的位置position = np.argwhere(before_state == 0)first_position = position[0][0]second_position = position[0][1]if first_position == 0:if second_position == 0:zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif second_position == 2:youyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif first_position == 2:if second_position == 0:xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)elif second_position == 2:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)else:if second_position == 0:zuoyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)elif second_position == 2:xiayi(before_state, first_position, second_position)youyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)else:youyi(before_state, first_position, second_position)xiayi(before_state, first_position, second_position)zuoyi(before_state, first_position, second_position)shangyi(before_state, first_position, second_position)def equal_all_position(first_checkerboard):for t in total_stack:num = 0for i in range(3):for j in range(3):if first_checkerboard[i][j] == t[i][j]:num += 1if num == 9:return 0else:passreturn 1def step_total_number(checkerboard):global final_checkerboardglobal total_steptotal_step = 0for i in range(3):for j in range(3):key = checkerboard[i][j]if (checkerboard[i][j] == 0):continueposition = np.argwhere(final_checkerboard == key)# 这里是获取到终止状态的位置horizontal_position = position[0][0]vertical_position = position[0][1]hang_step = abs(horizontal_position - i)lie_step = abs(vertical_position - j)total_step += hang_step + lie_stepif total_step == 0:print("最终结果为:")print(checkerboard)exit()return total_stepdef shangyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position + 1][second_position]  # 数字上移after_state[first_position + 1][second_position] = 0tap = equal_all_position(after_state)if tap:number = step_total_number(after_state)ruzhan(after_state, number)def xiayi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position -1][second_position]  # 数字下移after_state[first_position - 1][second_position] = 0tap = equal_all_position(after_state)if tap:number = step_total_number(after_state)ruzhan(after_state, number)def zuoyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position][second_position + 1]  # 数字左移after_state[first_position][second_position + 1] = 0tap = equal_all_position(after_state)if tap:number = step_total_number(after_state)ruzhan(after_state, number)def youyi(checkerboard, first_position, second_position):after_state = copy.deepcopy(checkerboard)after_state[first_position][second_position] = after_state[first_position][second_position - 1]  # 数字右移after_state[first_position][second_position - 1] = 0tap = equal_all_position(after_state)if tap:number = step_total_number(after_state)ruzhan(after_state, number)def ruzhan(checkerboard,number):global mid_stackglobal min_element_numberif len(mid_stack) == 0:mid_stack.append(checkerboard)total_stack.append(checkerboard)min_element_number = numberelse:if number > min_element_number:print("未插入")elif number == min_element_number:mid_stack.append(checkerboard)total_stack.append(checkerboard)min_element_number = numberelif number < min_element_number:mid_stack = []mid_stack.append(checkerboard)total_stack.append(checkerboard)min_element_number = numberprint(checkerboard)print("====================")def iterator_all_elements(final_stack):for i in final_stack:move_checkerboard(i)# 这里的教训告诉我们没事不要瞎用不熟悉的库,最后还是numpy转list
def judge_have_answer(initial_checkerboard):initial_checkerboard_result = 0final_checkerboard_result = 0initial_checkerboard_backup = copy.deepcopy(initial_checkerboard)final_checkerboard_backup = copy.deepcopy(final_checkerboard)new_initial = initial_checkerboard_backup.reshape((1,9)).tolist()[0]new_final = final_checkerboard_backup.reshape((1,9)).tolist()[0]new_initial.remove(0)new_final.remove(0)for i in range(8):for j in range(i):if new_initial[j] > new_initial[i]:initial_checkerboard_result += 1for i in range(8):for j in range(i):if new_final[j] > new_final[i]:final_checkerboard_result += 1return initial_checkerboard_result, final_checkerboard_resultdef main():initial_checkerboard = np.zeros((3, 3), dtype=int) #记录初始的棋盘状态print("空棋盘如下:")print(initial_checkerboard)print("请输入初始状态棋盘数据:")create_checkerboard(initial_checkerboard)print("初始棋盘状态如下:")print(initial_checkerboard)print("请输入终止状态棋盘数据:")create_checkerboard(final_checkerboard)print("最终棋盘状态如下:")print(final_checkerboard)print("-------------------")number1, number2 = judge_have_answer(initial_checkerboard)if (number1 % 2) != (number2 % 2):print("该起始状态无法达到最终状态!")exit()step_total_number(initial_checkerboard)global final_stackglobal mid_stackmid_checkerboard = copy.deepcopy(initial_checkerboard)final_stack.append(mid_checkerboard)total_stack.append(mid_checkerboard)global tempwhile(len(final_stack) != 0):temp += 1iterator_all_elements(final_stack)final_stack = copy.deepcopy(mid_stack)mid_stack = []print("this state no answer!")if __name__ == '__main__':main()

程序大致的流程走向图

相关方法的简单介绍:

课本中广度相关部分图片:

A算法:

A*算法

八数码问题的三种解法相关推荐

  1. 八数码问题的三种解决方式,其一:宽度优先搜索

    老师要求写一下八数码问题的三种解决方法,,,哎真的是苦了孩子了,只有在网上找找大佬们的代码来扩展了一下思路才勉强写出来,这里也分享一下自己的理解. 宽度优先与深度优先算法在八数码问题上的主要操作大同小 ...

  2. 算法总结——八皇后问题(三种解法)

    问题描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8 ...

  3. [简单题]自定义取余(三种解法)C++实现

    题目链接: 点击打开原题链接 题目意思,就是标题意思. 第一种解法:(加法迭代)用加法来模拟这个(17行代码) int mod256WithoutMod(int number) {if (number ...

  4. jsp判断字符串相等_最长回文字符串三种解法

    先解释一下什么是回文字符串,比如说字符串"aba",无论是从先往后读取还是从后往前读取,结果都是一样的.当给定很长的字符串时,如何快速获取到最长的回文字符串,这也是大厂比较常见的算 ...

  5. 【三种解法】剑指 Offer 06. 从尾到头打印链表【附完整可运行代码】

    立志用最少的代码做最高效的表达 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表 ...

  6. 【三种解法】Not so Mobile UVA - 839_19行代码AC

    立志用最少的代码做最高效的表达 Before being an ubiquous communications gadget, a mobile was just a structure made o ...

  7. 【LeetCode】1. 盛最多水的容器:C#三种解法

    题目:https://leetcode-cn.com/problems/container-with-most-water/ 盛最多水的容器 难度:中等 给你 n 个非负整数 a1,a2,...,an ...

  8. 一只青蛙跳向三个台阶_青蛙跳台阶问题的三种解法

    题目:一只青蛙一次可以跳 1 级台阶,也可以跳 2 级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 这道题还被 ITEye 放在了博文视点杯有奖答题活动里面. 我提供三种解法. 1.递归求解: ...

  9. 背包问题knapsack的三种解法(Python 和 C)

    最近研究了一下0-1背包问题,题目就不复述了,大家应该都知道的. 确切的说不是三种解法而是四种解法,下面我就一一写来. 0.枚举法 这种是最简单的一种做法,当然也是时间空间复杂度最大的方法,得到的肯定 ...

最新文章

  1. Exception in thread main java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  2. oracle 物化视图 --转
  3. 编程到底难在哪里? 从一个美国实习生的故事说起
  4. java微服务,微在哪_Java:ChronicleMap第3部分,快速微服务
  5. c++ string类的常用方法_【常用类方法】Object
  6. 来华30载,这些都是Oracle的神来之笔……
  7. PHP vscode+XDebug 远程断点调试服务器上的代码
  8. python读txt写入excel_Python读取txt内容写入xls格式excel中的方法
  9. php二级评论怎么实现,ThinkPHP视图模型实现二级嵌套评论的查询
  10. I.MX6 Manufacturing Tool V2 (MFGTool2) Emmc mksdcard-android.sh hacking
  11. MyBatis的9种设计模式,我猜你不知道
  12. 定理在数学中的简写形式_初中数学常用的定理大全
  13. 基于FPGA的交通灯——香樟路
  14. ctfshow-WEB-web2
  15. 【神奇的bug】main方法无法执行
  16. PADS-VX入门到精通实战项目讲解(上)—LOGIC部分-覃小刚-专题视频课程
  17. SQL注入-二次注入和多语句注入
  18. 微信九宫图生成HTML源码
  19. 格里高历日历判断闰年
  20. Pandas实战-DataFrame对象

热门文章

  1. LINUX 9 ASDL 连接
  2. 用学过的python写一个计算三角形面积和周长
  3. vcs Options
  4. HTML+CSS+JS练手小玩意
  5. ToDesk远程控制,详细介绍,使用教程
  6. 推荐一款国产远程控制软件ToDesk,轻量级,不限速,开启云办公新模式
  7. 电商平台-物流配送的设计与架构
  8. CE工具实例:修改植物大战僵尸植物2
  9. 【美国原装进口健身补充剂 乳清蛋白 绝对正品】
  10. CactiEZ-安装篇