PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 100 |
Estimate | 估计这个任务须要多少时间 | 20 | 30 |
Development | 开发 | 800 | 1000 |
Analysis | 需求分析 (包括学习新技术) | 60 | 120 |
Design Spec | 生成设计文档 | 30 | 20 |
Design Review | 设计复审 | 20 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 30 | 60 |
Coding | 具体编码 | 200 | 250 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 200 |
Reporting | 报告 | 60 | 150 |
Test Repor | 测试报告 | 10 | 30 |
Size Measurement | 计算工做量 | 20 | - |
Postmortem & Process Improvement Plan | 过后总结, 并提出过程改进计划 | 30 | 120 |
合计 | 890 | 1250 |
main(argv)函数html
DFS(i, x, y)函数java
judge(i, x, y)函数git
MY_OTP(i)函数github
简单流程图
算法
很明显代码已是炸了,不过比起第一次用pylint已经好很多了...第一次但是负分XD数组
看下效果,有所进步,剩下的就是命名的规范了
性能优化
通过一阵捣鼓评分提高了很多,但仍然没有达到满分,测试了一下代码正常运行
只能说,有时候投降不失为一种优雅的退场,我就不折磨本身了
网络
#改成直接给予参数,而不是从命令行接受 if __name__ == '__main__': # sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以弃之不用 #main(sys.argv[1:]) main(['-m', '9', '-n', '2', '-i', 'input.txt', '-o', 'output.txt'])
显然对于我来讲这个图是天书
app
由此表中可得知被调用次数最多和耗时最多的是judge()合法性判断函数和_DFS_()递归函数框架
M = 9 MY_MAPS = [] # 上面都是给judge()函数运行提供必要的全局变量 with open('output.txt', 'r', encoding='utf-8') as _fp_: # 此处直接读取已解矩阵用来判断合法性 _MYMAP_ = [] for line in _fp_.readlines(): if line != '\n': # 用换行符分割矩阵 _MYMAP_.append(list(map(int, line.strip().split(" ")))) else: MY_MAPS.append(_MYMAP_) _MYMAP_ = [] MY_MAPS.append(_MYMAP_) # MY_MAPS是集合了全部数据的三维数组 #单元测试时用来提供全局变量... ################# #global M, MY_MAPS # 行列不重复判断
import unittest from Sudoku import judge class test_judge(unittest.TestCase): def test_myfun(self): test_num = judge(0, 1, 2)#测试数值 self.assertEqual(test_num, 1)#指望值 if __name__ == '__main__': unittest.main()
GOOOOOD!测试符合预期结构
# -*- coding: UTF-8 -*- import sys import getopt # 全局变量 M = "" N = "" MY_MAPS = [] OP = ""
if __name__ == '__main__': # sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以弃之不用 main(sys.argv[1:])
def main(argv): """ 经过sys模块来识别参数 :return: """ # 声明全局变量 global M, N global MY_MAPS, OP in_put = "" out_put = "" try: # 获取参数并处理异常 opts, args = getopt.getopt(argv, "m:n:i:o:", ["help"]) except getopt.GetoptError: print('Error: Sudoku.py -m -n -i -o') sys.exit(2) # 处理获取的参数 for opt, arg in opts: if opt in "--help": # 给予帮助提示 print('Error: Sudoku.py -m -n -i -o') sys.exit() elif opt in "-m": M = int(arg) elif opt in "-n": N = int(arg) elif opt in "-i": in_put = arg elif opt in "-o": out_put = arg with open(in_put, 'r', encoding='utf-8') as _fp_: # 以读状态打开指定文件读取矩阵 _MYMAP_ = [] for line in _fp_.readlines(): if line != '\n': # 用换行符分割矩阵 _MYMAP_.append(list(map(int, line.strip().split(" ")))) else: MY_MAPS.append(_MYMAP_) _MYMAP_ = [] MY_MAPS.append(_MYMAP_) # MY_MAPS是集合了全部数据的三维数组 OP = open(out_put, 'w', encoding='utf-8') for i in range(N): if i > 0: OP.write('\n') # 分割矩阵 _DFS_(i, 0, 0) # 递归求解 OP.close()
def _DFS_(_i_, _x_, _y_): """ 【DFS】深度优先搜索递归方式 :return: """ # 声明引用全局变量 global M, MY_MAPS if _x_ > M - 1: # 完成条件 _MY_OTP_(_i_) # 保存数值 elif MY_MAPS[_i_][_x_][_y_] != 0: # 当前格子不可填 if _y_ == M - 1: # 右边界换行 _DFS_(_i_, _x_ + 1, 0) else: _DFS_(_i_, _x_, _y_ + 1) # 下一格 else: # 当前格可填 for i in range(1, M + 1): MY_MAPS[_i_][_x_][_y_] = i # 试探填入数值 if judge(_i_, _x_, _y_): # 判断其试探值的合法性,当判断函数返回值为1即合法 if _y_ == M - 1: # 边界状况 _DFS_(_i_, _x_ + 1, 0) else: _DFS_(_i_, _x_, _y_ + 1) # 回溯 MY_MAPS[_i_][_x_][_y_] = 0
def judge(_i_, _x_, _y_): """ 合法性判断 :return: """ global M, MY_MAPS # 行列不重复判断 for i in range(M): if i != _x_ and MY_MAPS[_i_][_x_][_y_] == MY_MAPS[_i_][i][_y_]: return 0 if i != _y_ and MY_MAPS[_i_][_x_][_y_] == MY_MAPS[_i_][_x_][i]: return 0 # 区块重复判断 _x1_ = _y1_ = row = col = 0 # 块内坐标初始值 # 区块定位参考于https://github.com/zxw0621/demo/blob/master/20177596/src/sudoku.py#L42 # 这定位写的太好了 # 根据其阶数肯定其模块规模以及所属模块 if M % 3 == 0: row = 3 col = int(M / 3) elif M % 2 == 0: row = 2 col = int(M / 2) _x1_ = int(_x_ // row * row) _y1_ = int(_y_ // col * col) # 遍历所属区块,检查其合法性 for i in range(_x1_, _x1_ + row): for j in range(_y1_, _y1_ + col): if _x_ != i and _y_ != j and MY_MAPS[_i_][_x_][_y_] == MY_MAPS[_i_][i][j]: return 0 return 1
def _MY_OTP_(_i_): """ 向文件内写入所得矩阵 :return: """ global N, M, MY_MAPS, OP # 遍历当前求解矩阵 for _x_ in range(M): for _y_ in range(M): OP.write(str(MY_MAPS[_i_][_x_][_y_]) + ' ') OP.write('\n') # 换行
try: # 获取参数并处理异常 opts, args = getopt.getopt(argv, "m:n:i:o:", ["help"]) except getopt.GetoptError: print('Error: Sudoku.py -m -n -i -o') sys.exit(2)
# 处理获取的参数 for opt, arg in opts: if opt in "--help": # 给予帮助提示 print('Error: Sudoku.py -m -n -i -o') sys.exit() elif opt in "-m": M = int(arg) elif opt in "-n": N = int(arg) elif opt in "-i": in_put = arg elif opt in "-o": out_put = arg
命令行
输入文件
输出文件
至此程序宣布完成...