
学习
打开秋天的内核
自学者
展开
-
勒让德符号破解奥数题
勒让德符号破解奥数题。原创 2022-11-01 10:13:02 · 244 阅读 · 0 评论 -
模重复平方算法
模重复平方算法。原创 2022-10-17 14:23:45 · 271 阅读 · 0 评论 -
你的文件安全吗?试试这款加密解密软件,提供源代码
你的文件安全吗?用这款加密解密软件试试,提供源代码网上有许多文件加密解密软件,但通常是没有公布源代码的。对于重要文件,为安全起见,最好还是用自行设计的软件进行加密解密。这款加密解密软件,是自行设计的,界面简洁,操作起来相当方便,后续提供源代码。加密前,先输入密码,再点击加密按钮。选择待加密文件,加密成功后会有文字提示。解密前,也要先输入密码,再点击解密按钮,选择待解密文件,解密成功后会有文字提示。观察源文件与加密文件内容,完全不同;观察源文件与解密文件内容,看不出有不同。采用16进制比较器进行比较原创 2022-06-15 10:32:30 · 167 阅读 · 0 评论 -
注册码生成器及加密程序
注册码生成器及加密程序原创 2022-06-07 16:03:38 · 5611 阅读 · 0 评论 -
半小时挑战九行代码(程序试金石)
半小时挑战九行代码(程序试金石) 编写一个在1,2,3,…,n(顺序不能变,n>=3)数字之间插入+或-或什么都不插入,使得计算结果为0的程序,并输出所有的可能性。 例如n=9时,1-23-4-56-7+89=0是一种可能性。原创 2022-04-12 08:23:33 · 167 阅读 · 0 评论 -
缺失的第一个正数
力扣答题(4)给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。示例:输入:nums = [1,2,0]输出:3来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/first-missing-positiveclass Solution(object): def firstMissingPositive(self, nums): """ :type nums: List[int]原创 2021-05-09 22:36:29 · 92 阅读 · 0 评论 -
2021-05-05
力扣答题(3)给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。示例:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum思路:暴力破解肯定会超时,用多指针方法比较有效。1、对数组从小到大进行排序。2、分别用三个指针指原创 2021-05-05 16:31:04 · 116 阅读 · 0 评论 -
2021-05-04
力扣答题(2)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。class Solution(object): def trap(self, height): """ :typ原创 2021-05-04 12:58:52 · 136 阅读 · 0 评论 -
2021-05-02
力扣答题(1)给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ for i原创 2021-05-02 20:35:41 · 88 阅读 · 0 评论 -
2021-03-27
增加打劫功能其实打劫功能还是相对简单的,比那个不入气的判断要简单一些。大致的思路是:1、确定打劫的特征状态。在没有提子前,当出现打劫时,应该是黑白各有一子均无外气。2、当这种特征状态是首次出现,可以进行提劫;如果是连续重复出现,说明是违规提劫,要返回到上一个状态。其实就这么简单。那个不入气的逻辑有些曲折。例如轮黑落子,先看一下黑是否已经无外气,如果是,再判断白棋是否也无外气,如果是,说明是提白棋,不是不入气;如果不是(白棋无外气),说明黑是不入气,返回到上一个状态。有些晕哈。另外增加了一个小的功原创 2021-03-27 12:05:25 · 209 阅读 · 1 评论 -
没有退缩的理由
每前进一步都很艰难,但很快乐参考围棋软件前面那个围棋自娱程序写到提子时出了问题,找了一阵子,最后发现是一个break没有加,很是郁闷。大致是这样的,当每落下一子时,要判断这个子是否跟已在棋盘上相同颜色的子连接在一起,如果是,它可能把2块或3块最多4块原本未完全连接的棋连在一起,一旦它们完全连接,需要把几块棋合并在一起成为一个整体。问题就发生在合并的过程中,使用-1标注合并后需要删除的块,结果这个-1在特定情况下加到了最后,导致一块大棋丢失。对前面那个程序进行了修订,虽然还没有特意考虑打劫,但相信很快会原创 2021-03-25 22:23:04 · 233 阅读 · 1 评论 -
2021-03-22
围棋软件制作了一个简单的围棋自娱软件,功能还很不完善,主要是没有判断胜负和打劫功能,另外提子还有些问题,但基本框架已经完成,先放着看看,后续再改进吧。# coding=gbkimport osimport sysimport copyimport pygamefrom pygame.locals import *pygame.init()screen1 = pygame.display.set_mode((1, 1))os.environ['SDL_VIDEO_CENTERED']原创 2021-03-22 23:18:31 · 208 阅读 · 0 评论 -
五子棋人机对战
五子棋人机对战参考:人机对战——填子游戏的攻防策略关于机器的应对策略,在前文中有所表述,不一一解释,本文进行了修缮和补强,但漏铜依然存在。增加了一个倒计时功能,测试了一下,感觉一般,还是留放在那里,表明曾经研究过,供今后完善。另外策略中增加了禁手。如果没有禁手和先手交换,理论上黑是稳赢的,但本程序还做不到这一点,看网友能否提供一个思路。from tkinter import *import tkinter as tkimport tkinter.messageboximport tkinter.原创 2021-02-17 13:24:13 · 978 阅读 · 1 评论 -
人机对战——填子游戏的攻防策略
人机对战——填子游戏的攻防策略问题:在18×18方阵中轮流在空白处放置黑白棋子,直到有一方形成横、竖、斜方向五连星获胜。参考:填子游戏把程序改成人机对战还是有些意思的。主要思路:1、人用鼠标点击落子,下棋策略靠人。2、机器的策略是:扫描个点,按防守和进攻分别给出分值,选择分值高的一方落子。3、如果分值达到或超过5分,即刻判决某一方获胜;然后分为连成无障碍的4子、连成有障碍的4子和无障碍的3子、连成两个无障碍的3子、连成一个无障碍的3子、连成二个无障碍的2子、连成一个无障碍的2子、其他七种情况,原创 2021-01-31 14:48:45 · 354 阅读 · 1 评论 -
2021-01-28
填子游戏在18×18方阵中轮流在空白处放置黑白子,直到有一方形成横、竖、斜方向五连星获胜。借鉴五子棋游戏编程思路,网上有许多,不一一赘述。直接看代码。from tkinter import *import tkinter.messageboximport numpy as np# 检查鼠标点击是否落在方格中,如果是,返回有效坐标def limit(event): global mark if mark == 0: for y in range(0, 18):原创 2021-01-28 23:29:07 · 161 阅读 · 1 评论 -
公务员经典考试题——翻币问题
公务员经典考试题——翻币问题硬币翻转问题:N(N是偶数)枚硬币均为正面朝上,每次翻转m枚硬币,要把所有的硬币翻转成反面朝上,求最短的操作序列(∗*∗代表正面,O代表反面)。这个问题有一定难度,思路大致如下:1、分别考虑以下几种情况:(1)n%m0或nm(2)m<N/2(3)m>N/2且n%m!=42、对于n%m0或nm,easy。3、对于m<N/2,重点讨论。(1)每次翻m个,直到剩余的∗*∗数量a落入到m<a<2*m之间。进入(2)。(2)a值取半数,为奇原创 2021-01-23 23:01:03 · 604 阅读 · 1 评论 -
硬币翻转
硬币翻转问题:N(N是偶数)枚硬币均为正面朝上,每次翻转N-1枚硬币,要把所有的硬币翻转成反面朝上,求最短的操作序列(*代表正面,O代表反面)。这个问题还是相当简单,如何把程序写漂亮才是重点。思路:每轮翻转,让一个硬币不翻转,其他都翻转。这个不翻转的硬币按顺序从数组中取即可。try: n = int(input("请输入硬币个数(偶数):\n")) if n % 2 != 0: print("输入错误!") exit() coin = ['*'原创 2021-01-17 10:31:58 · 606 阅读 · 1 评论 -
巧排数字
巧排数字问题:将连续整数1、2、……n(n<=12)按一定顺序排成一排,让相邻2个数之和和首尾两个数之和均为素数,输出所有排法。用递归肯定可以解决问题。def prime(n): # 判断是否素数 if n == 2: return True if n % 2 == 0: return False for i in range(3, int(n ** 0.5) + 1, 2): if n % i == 0:原创 2021-01-16 20:16:54 · 239 阅读 · 0 评论 -
假币之谜
假币之谜有八个硬币a,b,c,d,e,f,g,h,其中一枚是假币,从外观无法分辨,比真币或轻或重。使用天平,用最少比较次数,找出假币,并分辨出轻重。#include <iostream>using namespace std;int weight(float x, float y) { if (x == y)return 0; else if (x > y)return 1; else return 2;}int main(){ float a原创 2021-01-13 23:16:59 · 221 阅读 · 0 评论 -
递归运用——钱币系统问题
递归运用——钱币系统问题问题:(钱币系统问题) 某钱币系统由 k (k≤20) 种硬币组成,币值依次为 a[1]、 a[2]、……、a[k], 其中 a[i] (i=1,2,……,k) 为互不相同的正整数,且依降序排列, a[1]≤200。给定某整数币值 n(n≤3000), 要求用最少枚数的硬币表示这个币值。输入格式为:第一行:k (硬币种数)第二行:a[1]、 a[2]、 … a[k] (各币值用空格隔开,已按降序排列好)第三行:n (给定的币值)直接在屏幕上输出结果。如果该钱币系统无法表示币原创 2021-01-10 15:48:12 · 333 阅读 · 0 评论 -
2021-01-03
问题既复杂又简单问题:编写一个在1,2,…,n(顺序不能变,n<=9)数字之间插入+或-或*或/或什么都不插入,使得计算结果为0的程序,并输出所有的可能性。#include<iostream>#include<deque>#include<vector>#include <math.h> #include<string>using namespace std;int n;//以'0'、'1'、'2'、替代' '、'+'、'原创 2021-01-03 23:21:30 · 194 阅读 · 0 评论 -
C++——do while应用
C++——do while应用移动问题:有一行数据,左边有n个1,右边有n个2,1和2相邻可以交换,至无连续的1相邻和无连续的2相邻为止。显示移动过程。这个问题一开始认为用递归应该没有问题,程序如下:#include <iostream>#include<deque>#include<time.h>using namespace std;void dfs(string s);deque <string> result;string sourc原创 2021-01-02 14:49:37 · 249 阅读 · 0 评论 -
继续修炼——从一种状态到另一种状态的最短路径(之goto语句)
继续修炼——从一种状态到另一种状态的最短路径(之goto语句)参考:继续修炼——从一种状态到另一种状态的最短路径还是把题目再说一遍,不然续得太多,都不知道题目是什么了。问题:在一行数据中,有3个1,3个2,1个0,0(空格)在中间,1和2分居左右,每个数据占据一格,如下:1, 1, 1, 0, 2, 2, 2通过移动把上述排列变成:2, 2, 2, 0, 1, 1, 1移动规则:1、1只能向右移动,2只能向左移动。2、在下列两种条件下可以移动:一是移动一格,恰好进入到空格子中,二是跳过原创 2021-01-01 22:38:28 · 217 阅读 · 0 评论 -
继续修炼——从一种状态到另一种状态的最短路径
继续修炼——从一种状态到另一种状态的最短路径(续三)参考继续修炼——从一种状态到另一种状态的最短路径(再续)用C++再写一遍:#include <iostream>#include<deque>#include<time.h>using namespace std;void dfs(string s);deque <string> result;string source, target;time_t start_time;int n;原创 2021-01-01 12:26:18 · 239 阅读 · 0 评论 -
2020-12-31
继续修炼——从一种状态到另一种状态的最短路径(再续)参考:继续修炼——从一种状态到另一种状态的最短路径(续)当n超过12以后,宽搜就显得时间漫长了。因此,改进方法是必然的。采用递归的方法是解决这类问题比较好的方法。设置了一个交换函数和一个递归函数,在四种情况下递归,即向左移动的两种方式和向右移动的两种方式,程序就不详解解释了。import copyimport timedef dfs(s): state = copy.deepcopy(s) if state == target原创 2020-12-31 23:29:53 · 152 阅读 · 0 评论 -
2020-12-30
继续修炼——从一种状态到另一种状态的最短路径(续)参见:继续修炼——从一种状态到另一种状态的最短路径问题:在一行数据中,有3个1,3个2,1个0,0(空格)在中间,1和2分居左右,每个数据占据一格,如下:1, 1, 1, 0, 2, 2, 2通过移动把上述排列变成:2, 2, 2, 0, 1, 1, 1移动规则:1、1只能向右移动,2只能向左移动。2、在下列两种条件下可以移动:一是移动一格,恰好进入到空格子中,二是跳过一个与自身非相同数字进入到空格。数字移动或跳动之后留下一个空格。要求原创 2020-12-30 22:42:16 · 110 阅读 · 1 评论 -
2020-12-30
继续修炼——从一种状态到另一种状态的最短路径问题:有两行数据,第一行3个,第二行5个,包括1-5和3个0。数据交换的规则是:各行相邻数据其中之一为0的(另一个不为0)可以相互交换。上下两行之间只能交换中间位置(位置1和位置5)的数据,并且两个数据之一为0(另一个不为0)。例如: 4 5 1 0 2 3 0 0 移动一步可以转换到 4 5 1 0 2 0 3 0 然后再移动一步转换到 4 0 1 0 2 5 3 0 找出从一原创 2020-12-30 10:46:01 · 135 阅读 · 1 评论 -
2020-12-22
八皇后问题——经典再现在8×8的方格中,放置8个皇后,使其相互不冲突,即任意一个皇后所在的行、列和斜线均无其它皇后。以下是其中两种放置方法。 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 3 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 6 0 0 0 0 0原创 2020-12-22 22:47:12 · 137 阅读 · 1 评论 -
蛇形排列的种数
蛇形排列的种数问题:在4×4方格中按蛇形排列放置1-16个数字,以下是二种放置方法:13 12 1 214 11 4 315 10 5 616 9 8 71 2 13 124 3 14 115 16 15 106 7 8 9计算总共有多少种放置方法,并打印其中的20种放置方法。这应该是一道竞赛题的变种。解题思路如下。1、分清楚外层递归和内层递归,这个相当关键,详见程序。2、进入放置环节前先看放置是否越原创 2020-12-21 19:36:46 · 3643 阅读 · 1 评论 -
经典再现(续)
经典再现(续)参考经典再现前面那个程序还是有改进的余地。最后那一段关于显示的代码可以省略。原因是在分离数字和运算符的同时可以进行累加计算。增加一个符号变量symbol,预设为1。对于第一数,无条件进行累加,之后如果遇到加号,就设置成1,如果遇到减号,就设置为-1,每次累加前先乘以符号变量。程序代码精简了不少。这次把计算结果为0的算式打印出来。#include<iostream>#include<deque>#include <math.h> #includ原创 2020-12-19 22:30:46 · 185 阅读 · 1 评论 -
2020-12-18
经典再现程序的魅力在于它的无限可能性和条条大路通罗马的各种算法。看这道经典题:编写一个在1,2,…,n(顺序不能变,n<=9)数字之间插入+或-或什么都不插入,使得计算结果为0的程序,并输出所有的可能性。参考关于一个优秀程序员半小时必须解决的5个问题(之一)如果指定n,可以多重循环进行暴力破解。但如果n需要键盘输入,就不是那么好操作。通常的做法是采用递归替代多重循环。这里采用编码的方式进行破解,还是相当有趣的,网友不妨看看。编程思路:1、假设’0’、‘1’、‘2’、对应’ ‘、’+’、’-原创 2020-12-18 21:28:59 · 265 阅读 · 2 评论 -
2020-12-13
在C++和Python之间切换(续)参考在C++和Python之间切换既然用Python能够写成,用C++肯定也成,而且速度应该更快才对。但出乎意料的是,几乎比照Python写的程序,费了九牛二虎之力,总是能够运行,但速度竟然比不上Python,不知道出了什么问题。各位帮我看看。#include<iostream>#include<set>#include<deque>#include<vector>#include<time.h>原创 2020-12-13 20:52:32 · 131 阅读 · 0 评论 -
2020-12-10
在C++和Python之间切换有一段时间没有使用Python,要练练手。关于八数码问题的A算法,网上有很多,基本拜读了,受益匪浅。之前觉得用A算法不能肯定能够获得最短途径。但仔细分析发现,其实很多的A*算法与Dijkstra算法基本一致,就此确定能够获得最短路径,至于原因,读者可自行百度Dijkstra算法。大致的思路如下。1、判断是否有解,无解直接退出,有解进入步骤。2、建立Open和Close两个数组,Open初始化放入source(包括步长为0,曼哈顿距离,source,父状态(为空))。3原创 2020-12-10 12:07:40 · 123 阅读 · 1 评论 -
2020-12-05
goto语句是一把双刃剑在很多文章里,都说最好不要用goto语句,但既然C++有,就一定有它的用武之地。八数码问题的最终解决,可能还是要用双向宽搜,办法虽然笨,但获得最短路径肯定是妥妥的。网上一些八数码程序都只报了搜索层次,但具体路径没有。原因是节省内存开销,极大提高运算速度,但没有过程总是遗憾,自己补上。测试了一下,不算完美(后续再改进),但比起python,速度还是要快很多。不啰嗦,直接上代码。#include<iostream>#include <string.h>原创 2020-12-05 21:43:07 · 152 阅读 · 0 评论 -
2020-12-04
C++的第一个类——数据结构带来的美试尝着用C++写了一些程序,但类的结构和使用一直是困惑我的。当设置一个set容器,往里面添加类对象时,问题来了,除了第一数据,其它是存不进的。在网上学习后,发现要重载小于(<)运算符,找了一些例子,终于试验成功,在八数码编程中试验了一把,还是很给力的,看看吧。#include<iostream>#include<set>#include<deque>#include<time.h>using namespa原创 2020-12-04 20:04:53 · 124 阅读 · 0 评论 -
2020-11-27
不介意用C++再写一遍(一)八数码问题研究有一段时间了,但总感觉速度太慢,验证起来不爽,所以把多年前学的C++再温习了一遍。先写一个简单的(单向宽搜)看看成效。#include<iostream>#include<set>#include<time.h>using namespace std;set<string> sun;set<string> sum;set<string> summ;//'0'从某个位置移到到另外原创 2020-11-27 21:48:10 · 155 阅读 · 0 评论 -
2020-11-14
八数码问题——持续更新中(二)参考八数码问题——持续更新中(一)八数码问题(再续)前文说到双向搜索的重要性。当采用种子搜索时,如果出现搜索层次超过规定要求,可以使用双向搜索方法求得最短路径。现在可以肯定,再复杂的案例,这个程序在40s左右是可以获得最短路径的(因电脑而异),它的重要性不言而喻。完全程序清单如下。# 建立一个链表类,按层次保存状态列表class Lists: def __init__(self, layer, father): self.layer = la原创 2020-11-14 20:39:02 · 123 阅读 · 0 评论 -
2020-11-14
八数码问题——持续更新中(一)最近一段时间一直在思考,没有时间写东西……现在能够短暂坐下来,还是把前面的程序改改。八数码问题已经写了多篇,但仍然感到意犹未尽。其实双向搜索还是可行的。只是当时认为搜索的层数比较多,觉得这个程序的适应性比较差。但随着认识的变化,这个程序的重要性凸显出来,于是又回过头来对这个程序进行修订,暂且不提。认识的变化还在于最多需要搜索多少层上。有部分证据说明最多搜索不会超过30层。基本思路是这样的:任意选取一种状态(原始状态),然后筛选出从该状态变化到其他状态的所有组合,计原创 2020-11-14 10:39:05 · 140 阅读 · 0 评论 -
2020-11-03
八数码问题再探讨在原来程序可以这样写!——八数码问题优选算法(重磅)这篇文章中,我把种子的数量定为500,但问题来,在一次不经意的验证中,发现以下情况:source = [1, 2, 3, 4, 0, 5, 6, 7, 8] target = [0, 8, 7, 6, 5, 4, 3, 2, 1]在这个例子中,转换的步数达到30,感到有些疑惑。遂把种子的数量提升到1100,大约花了53s,显示的步数只有28,因此可以肯定,上述程序对个例在种子只有500的情况下还是算不出最短路径。如果增加种子数量原创 2020-11-03 20:47:18 · 156 阅读 · 0 评论 -
2020-11-01
原来程序可以这样写!——八数码问题优选算法(重磅)前期对八数码问题进行过三次探讨,见以下链接:八数码问题八数码问题(续)八数码问题(再续)这三次探讨都没有涉及A算法,所以效率比较低。对于高难度案例,尚不能在短时间内获得结果,这是我一直耿耿于怀的。A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。看了网上的一些A算法案例,受到一些启发。但疑问总是有的。其一,A算法是否一定能给出最少移动步数原创 2020-11-01 16:56:17 · 339 阅读 · 0 评论