算法趣题
安達と島村
学习记录用,可能有错误的地方
展开
-
Q43让玻璃杯水量减半
E:/GitHub/suanfaquti/Q43让玻璃杯水量减半.py'''问题描述ABC是三个大小各不相同的玻璃杯。初始状态A装满水,B和C空。不使用任何辅助工具,倒水时只能倒到这个杯子变为空杯,或者目标杯子满杯的状态。重复这样的倒水操作,使A杯剩余水量是“最初的一半”。举个例子,如果A、B、C的容量分别为8、5、3,则可以通过下列步骤来实现。800→350→323→620→6...原创 2019-05-12 12:16:33 · 172 阅读 · 0 评论 -
Q31计算最短路径1
E:/GitHub/suanfaquti/Q31计算最短路径1.py'''问题描述一个边长n的正方形划分成n*n个边长1的小正方形,所有的边和点构成一张图,求从左上到与右下再返回左上的所有最短路径中没有经过重复线段的路径数。例如n=2时一共有10种往返路径。求n=6时,共有多少种最短路径?分析本题可转化成从左上同时找两条路径到右下,要求路径最短且无重复。显然每次只能往右或者下走。对每...原创 2019-05-11 00:42:53 · 110 阅读 · 0 评论 -
Q30用插线板制作章鱼脚状线路3
E:/GitHub/suanfaquti/Q30用插线板制作章鱼脚状线路3.py#把重复的路径也算进去了,答案有误defdfs(blankNum,headNum,way):#print(blankNum,headNum)try:#returnmemory[(blankNum,headNum)]passexceptKeyErr...原创 2019-05-11 00:42:20 · 164 阅读 · 0 评论 -
Q30用插线板制作章鱼脚状线路2
E:/GitHub/suanfaquti/Q30用插线板制作章鱼脚状线路2.py#把递归的dfs转动态规划m=20dfs1=[0]*(m+1)dfs1[1]=1forninrange(2,m+1):cnt=dfs1[n]foriinrange(1,n//2+1):ifi==n/2:c=dfs1[i]...原创 2019-05-11 00:41:46 · 154 阅读 · 0 评论 -
Q30用插线板制作章鱼脚状线路1
E:/GitHub/suanfaquti/Q30用插线板制作章鱼脚状线路1.py#参考资料https://blog.csdn.net/guzhou_diaoke/article/details/81045551#commentBox'''有双插口和三插口的插线板。墙壁上只有1个插座能用,而需要用电的电器有20台,求方法数。使用同一个插线板时,不考虑插口位置,只考虑插线板的连接方法。如果3...原创 2019-05-11 00:41:12 · 200 阅读 · 0 评论 -
Q29合成电阻的黄金分割比
E:/GitHub/suanfaquti/Q29合成电阻的黄金分割比.py'''问题描述现有n个1Ω的电阻。组合这些电阻,使总电阻值接近黄金分割比1.6180339887…。举个例子,当n=5时,如果像图这样组合,则可以使电阻值为1.6。求n=10时最接近黄金分割的数值,请精确到小数点后10位。分析把所有可能的数值加起来'''defseries_connection...原创 2019-05-11 00:40:35 · 147 阅读 · 0 评论 -
Q28社团活动的最优分配方案
E:/GitHub/suanfaquti/Q28社团活动的最优分配方案.py'''问题描述校内有很多社团,需要用地和人数见sizes和humans,现在选任意各社团,求总人数不超过150时最大的用地面积。分析01背包'''sizes=[11000,8000,400,800,900,1800,1000,7000,100,300]humans=[40,30,24,20,14,16,15...原创 2019-05-11 00:40:01 · 161 阅读 · 0 评论 -
Q27禁止右转也没关系吗
E:/GitHub/suanfaquti/Q27禁止右转也没关系吗.py'''问题描述(有修改)现有a*b的井字形道路,从左下角走到右上角,只能执行或者左转,有多少走法?例如4*3的道路有4种,分别是→→→↑↑,→→↑↑←←↓→→→↑,→→↑↑←↓→→↑,→↑↑←↓→→→↑分析深度优先搜索,参数是单次行动的起点和终点,用点的marked数组来标记线段是否走过...原创 2019-05-10 21:49:54 · 117 阅读 · 0 评论 -
Q26高效的立体停车场
E:/GitHub/suanfaquti/Q26高效的立体停车场.py'''问题描述(有修改)10*10的棋盘上放了10*10-1的棋子,右下角空白。每次可以交换空白和它相邻的一个棋子,求将左上角的棋子移动到右下角的最少次数分析棋子只能右移或者下移,否则不是最少。则移动棋子前空白在棋子右/下,交换后在左/上。那么整个移动过程可以分成两步,重复这两步a+b次即可(设棋盘变成是a和b)步...原创 2019-05-10 21:49:21 · 189 阅读 · 0 评论 -
Q25鞋带的时髦系法
E:/GitHub/suanfaquti/Q25鞋带的时髦系法.py'''问题描述(有修改)12个点11条边,点组成一个长方形,高6宽2,上方每个点只有1条边经过,其他点2条边,求11条边在长方形内部交叉点最多的情况。分析画坐标轴,遍历下10个点得到10!条路径,在把上面两个点做起点和终点得到完整路径,计算出11条边,双层遍历,如果两条边都切割正方形,且a边端点的纵坐标减去b边相应端...原创 2019-05-10 21:48:49 · 156 阅读 · 0 评论 -
Q23二十一点通吃
E:/GitHub/suanfaquti/Q23二十一点通吃.py'''问题描述(有修改)10个硬币读博,每轮赌一个,赢了+1输了-1,求24轮后手里还有硬币的路径和分析很简单的动态规划,f(a,b)=f(a-1,b-1)+f(a-1,b+1),a,b分别表示剩余轮数和剩余硬币数'''importnumpyasnptimes,coin=24,10n=np.zeros((tim...原创 2019-05-10 21:48:14 · 139 阅读 · 0 评论 -
Q31计算最短路径2
E:/GitHub/suanfaquti/Q31计算最短路径2.py'''分析用1表示→0表示↓,那么所有的走法set(permutations([0]*n+[1]*n,n*2))表示,实际上两条路径的终点分别是(6,5)和(5,6),可以的到ways1和ways2,遍历它们,对每一条way1和way2从左往右遍历,当且仅当两条路径的连续两个和相等时重复。代码在计算ways...原创 2019-05-11 00:43:27 · 117 阅读 · 0 评论 -
Q31计算最短路径3
E:/GitHub/suanfaquti/Q31计算最短路径3.py'''获取路径的方法改成bfs。n=8需要4s,n=9需要很久'''fromitertoolsimportpermutationsfromqueueimportQueueimporttime,copydefgetWays(a,b):q1=Queue()q1.put((1,1)...原创 2019-05-11 00:44:00 · 134 阅读 · 0 评论 -
Q32榻榻米的铺法
E:/GitHub/suanfaquti/Q32榻榻米的铺法.py'''问题描述房间由纵3×横4的12个边长1的正方形构成,我们需要在这个房间里铺6张(1*2)榻榻米,要求任何榻榻米之间不能形成十字形状,此时有4种铺法,分别是:*********************************[[1.1.2.2.][3.4.4.5.][3.6.6.5.]]**...原创 2019-05-11 00:44:35 · 219 阅读 · 0 评论 -
Q42将牌洗为逆序2
E:/GitHub/suanfaquti/Q42将牌洗为逆序2.py'''分析使用双向的bfs,即从起点找能到达的点,同时从终点找能到达它的点,两个点集有共同元素就找到了。注意点:1、本来使用list记录牌(set无序),但是list不能通过set快速查找重复项,所以选择用字符串记录2、从1234遍历是把中间的牌放上面,反过来从4321遍历要把上面的牌放中间,而不...原创 2019-05-12 12:15:59 · 149 阅读 · 0 评论 -
Q42将牌洗为逆序1
E:/GitHub/suanfaquti/Q42将牌洗为逆序1.py'''问题描述有2n张牌,每次从中取n张放到最上面(不是分散抽取而是抽取连续的一沓牌),重复操作直到逆序。比如当4张牌时,顺序是1234->2314->3124->2431->4321.分析使用bfs,记录每次抽取后的结果和已经使用的步数,牌数大于等10后速度非常慢。'''fromitert...原创 2019-05-12 12:15:24 · 547 阅读 · 0 评论 -
Q41只用1个数字表示 1234
E:/GitHub/suanfaquti/Q41只用1个数字表示 1234.py'''问题描述只用1个数字表示1234,求用哪个数字表示用得最少。如1111+111+11+1=1234用了10个1。分析和前面某四则运算题很像,这里从5个符号取n个并排序的种数是5**n,必须使用product。一个坑:原来的代码是res[i]=product(symbols,repeat=i),pro...原创 2019-05-12 12:14:50 · 475 阅读 · 0 评论 -
Q40优雅的IP地址
E:/GitHub/suanfaquti/Q40优雅的IP地址.py'''问题描述ip地址格式如a.b.c.d,现将a,b,c,d分别转成2进制数的到e,f,g,h(不够8位的前面补充0)。求所有的ip地址里同时满足条件1和条件的的ip。条件1:e,f,g,h一起构成对称的字符串条件2:ip地址使用0-9各一次分析按照题意,用十进制数表示时要使用0~9这10个数字各1次,...原创 2019-05-12 12:14:15 · 184 阅读 · 0 评论 -
Q39反复排序
E:/GitHub/suanfaquti/Q39反复排序.py'''问题描述1-n共n个数字。如果第1个数字为k时,则把前k个数逆序,一直重复这个操作。例如数字是362154时,变化过程如下:362154-->263154->623154-->451326-->315426-->513426-->243156-->423156-->1324...原创 2019-05-12 12:13:40 · 111 阅读 · 0 评论 -
Q38填充白色
E:/GitHub/suanfaquti/Q38填充白色.py'''问题描述4×4的方格颜色是白或者黑。选中任意一个方格的时候把该方格所在的行和列全部反色,反复进行这个处理(不能重复选择同一方格),无论初始状态如何,一定能使所有方格全部变为白色。请思考反色操作的次数最多的初始状态,并求这个最多次数是多少。分析任何一个操作都会使7个方格变色,创建单点反色和7点变色的映射(矩阵c),这样...原创 2019-05-12 12:13:09 · 94 阅读 · 0 评论 -
Q37翻转7段码2
E:/GitHub/suanfaquti/Q37翻转7段码2.py'''使用permutations代替搜索,更慢了'''importnumpyasnp,timefromitertoolsimportpermutationst1=time.clock()a0=(1,1,1,1,1,1,0)a1=(0,1,1,0,0,0,0)a2=(1,1,0,1,1,0,1)a3=(...原创 2019-05-12 12:12:36 · 133 阅读 · 0 评论 -
Q37翻转7段码1
E:/GitHub/suanfaquti/Q37翻转7段码1.py'''问题描述计算器、运动计时器等所用的“7段显示屏”(7-segmentdisplay)是使用如图8所示的7个部分的亮灭来显示1个数字的(这里有A~G这7个比特,对应比特为1时亮灯,为0时灭灯) 用于显示各个数字的nABCDEFG01111110101...原创 2019-05-12 12:12:04 · 281 阅读 · 0 评论 -
Q34会有几次命中注定的相遇2
E:/GitHub/suanfaquti/Q34会有几次命中注定的相遇2.py'''对1.py的dfs使用字典存储结果'''importtime,numpyasnpn=6t1=time.clock()res={}defsearch(manX,manY,wX,wY,meetTimes):if(manX,manY,wX,wY,meetTimes)inr...原创 2019-05-12 12:11:33 · 104 阅读 · 0 评论 -
Q34会有几次命中注定的相遇1
E:/GitHub/suanfaquti/Q34会有几次命中注定的相遇1.py'''问题描述边长n的正方形被划分成n*n个边长为1的正方形。男生从左上到右下,女生从右下到左上,分别沿着最短路径以相同速度前行。如果符合以下情形,则判断为“命中注定的相遇”。① 两次同时停在同一水平直线或者垂直直线上② 同一时间到达同一顶点分析第一种状态横坐标或者纵坐标两次或两次以上相同,第二种状态横坐标...原创 2019-05-11 00:45:09 · 120 阅读 · 0 评论 -
Q22不缠绕的纸杯电话
E:/GitHub/suanfaquti/Q22不缠绕的纸杯电话.py'''问题描述(有修改)正n边形(n是偶数),把所有点用n/2条线连接,每个点都被连接,要求这些线不相交。求当n=16时有多少连接方式分析设f(n)表示n个点的连法的总数。给16个点编号0到15,那么0只能连接奇数序号,共8种连法,每一种连法的种数,就等于f(a)*f(b),a,b分别两侧的点数(都是偶数)。'''...原创 2019-05-10 21:47:40 · 152 阅读 · 0 评论 -
Q21异或运算三角形
E:/GitHub/suanfaquti/Q21异或运算三角形.py'''问题描述求异或运算三角形第2014个0出现在第几行。图片如下第1层1第2层11第3层101第4层1111第5层10001第6层110011分析题目本身很简单,肯定有更简单的做法'''fromqueueimportQueue...原创 2019-05-10 21:47:07 · 335 阅读 · 0 评论 -
Q08优秀的扫地机器人2
E:/GitHub/suanfaquti/Q08优秀的扫地机器人2.py'''问题描述现在有很多制造商都在卖扫地机器人,可是这些机器人有时候会反复清扫某一个地方。假设有一款机器人不会反复清扫同一个地方,它只能前后左右移动。举个例子,如果第1次向后移动,那么连续移动3次时,就会有以下9种情况(见图)。又因为第1次移动可以是前后左右4种情况,所以移动3次时全部路径有9*4=36种...原创 2019-05-09 03:08:07 · 170 阅读 · 0 评论 -
Q08优秀的扫地机器人1
E:/GitHub/suanfaquti/Q08优秀的扫地机器人1.py'''问题描述现在有很多制造商都在卖扫地机器人,可是这些机器人有时候会反复清扫某一个地方。假设有一款机器人不会反复清扫同一个地方,它只能前后左右移动。举个例子,如果第1次向后移动,那么连续移动3次时,就会有以下9种情况(见图)。又因为第1次移动可以是前后左右4种情况,所以移动3次时全部路径有9*4=36种...原创 2019-05-08 19:15:07 · 199 阅读 · 0 评论 -
Q05硬币兑换3
E:/GitHub/suanfaquti/Q05硬币兑换3.py'''现有10,50,100,500四种硬币大量,用最多15枚硬币分解1000元分析:除以10再动态规划,这是个完全二重背包问题'''importnumpyasnpcoins=[0,1,5,10,50]maxn=15maxv=100defget(maxn,maxv):xl,yl=maxn+1,maxv+...原创 2019-05-08 19:14:34 · 125 阅读 · 0 评论 -
Q05硬币兑换2
E:/GitHub/suanfaquti/Q05硬币兑换2.py'''现有10,50,100,500四种硬币大量,用最多15枚硬币分解1000元分析:不需要除以10,代码3使用动态规划所以一起除了'''coins=[0,1,5,10,50]maxv,maxn=100,15defgetcoin1(n,v,c,selects):ifv==0andc>=0:...原创 2019-05-08 19:14:01 · 156 阅读 · 0 评论 -
Q05硬币兑换1
E:/GitHub/suanfaquti/Q05硬币兑换1.py'''现有10,50,100,500四种硬币大量,用最多15枚硬币分解1000元分析:不需要除以10,代码3使用动态规划所以一起除了'''coins=[0,1,5,10,50]maxv,maxn=100,15count=0defgetcoin(n,v,c,selects):globalcountif...原创 2019-05-08 19:13:27 · 125 阅读 · 0 评论 -
Q04切分木棒3
E:/GitHub/suanfaquti/Q04切分木棒3.py#参数分别是人数,长度fromqueueimportQueuedefcut(n,length):count=0nums=1#当前木棒数量whilenums<length:ifnums<=n:nums*=2else:...原创 2019-05-08 19:12:56 · 110 阅读 · 0 评论 -
Q04切分木棒2
E:/GitHub/suanfaquti/Q04切分木棒2.py#参数分别是人数,长度,当前木棒数量defcut(n,length,nums):ifnums>=length:return0ifnums<=n:returncut(n,length,nums*2)+1else:returncut(n,leng...原创 2019-05-08 19:12:24 · 89 阅读 · 0 评论 -
Q04切分木棒1
E:/GitHub/suanfaquti/Q04切分木棒1.py'''假设要把长度为n厘米的木棒切分为1厘米长的小段,但是1根木棒只能由1人切分,当木棒被切分为3段后,可以同时由3个人分别切分木棒(图2)。求最多有m个人时,最少要切分几次。譬如n=8,m=3时切分4次就可以了。'''#这个题思路的核心就在于尽快让更多的人参与到工作中来,#实...原创 2019-05-08 19:11:52 · 186 阅读 · 0 评论 -
Q03翻牌
E:/GitHub/suanfaquti/Q03翻牌.py'''这里有100张写着数字1~100的牌,并按顺序排列着。最开始所有牌都是背面朝上放置。某人从第2张牌开始,隔1张牌翻牌。然后第2,4,6,…,100张牌就会变成正面朝上。接下来,另一个人从第3张牌开始,隔2张牌翻牌(原本背面朝上的,翻转成正面朝上;原本正面朝上的,翻转成背面上)。再接下来,又有一...原创 2019-05-08 19:11:19 · 132 阅读 · 0 评论 -
Q02数列的四则运算
E:/GitHub/suanfaquti/Q02数列的四则运算.py'''组合的方法是在各个数字之间插入四则运算的运算符组成算式,然后计算算式的结果(某些数位之间可以没有运算符但最少要插入1个运算符)。假设这里的条件是,组合算式的计算结果为“将原数字各个数位上的数逆序排列得到的数”,并且算式的运算按照四则运算的顺序进行(先乘除,后加减)。例如100-999有3个这样的数3*51=153...原创 2019-05-08 19:10:46 · 177 阅读 · 0 评论 -
Q09落单的男女1
E:/GitHub/suanfaquti/Q09落单的男女1.py'''问题描述(有少量修改)3男(1)3女(0)组成一队,如果从任何地方切成两队,这两队的男女人数都不等,则称为不均等队。如110100是不均等队,110001是均等队(切成1100和01即可)。不考虑人的不同,即1101和1101是一队,不考虑(m1m2w1m3)这样的情况。现在有20男10女,求可以组成的不均等队的数量...原创 2019-05-09 03:08:42 · 137 阅读 · 0 评论 -
Q09落单的男女2
E:/GitHub/suanfaquti/Q09落单的男女2.py'''将1的代码改成动态规划的,比递归快很多。'''m,w=20,10k=min(m,w)#棋盘宽度res=set()foriinrange(1,k+1):res.add((i,i))res.add((m-i,w-i))if(0,0)inres:...原创 2019-05-09 03:09:16 · 96 阅读 · 0 评论 -
Q10轮盘的最大值
E:/GitHub/suanfaquti/Q10轮盘的最大值.py'''当1<n<37时,求连续n个数的和最大的情况下满足“欧式规则下和小于美式规则的和”的n分析新加入的数字减去第一个的值加上原来的sum就是新sum'''o=[0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23,10,...原创 2019-05-09 03:09:51 · 140 阅读 · 0 评论 -
Q20受难立面魔方
E:/GitHub/suanfaquti/Q20受难立面魔方.py'''问题描述从nums取任意个数使和为33有310种情况。求是否有更多情况的和分析01背包动态规划。用二维数组从左往右遍历,一维数组从右往左遍历。。。'''nums=[1,2,3,4,5,6,7,8,9,10,10,11,13,14,14,15]sumMax=sum(nums)res=[0]*(sumMax+1)...原创 2019-05-10 21:46:35 · 133 阅读 · 0 评论