原版题目链接:NOIP2004 虫食算
简化版:所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。
BADC
+ CBDA
────
DCCC
给出一个N进制的虫食算式,相同的字母代表相同的数字,不同的字母代表不同的数字。
要求求出满足这个算式的唯一一组解,也就是字母和数字的一一对应关系.
【方法1】暴力枚举
要求一一对应的关系,就可以枚举这些一一对应的关系,找出符合的一项。这样,关系总数有O(N!)个,最坏情况下必须枚举所有的关系,并且加以判断,复杂度高达O(N*N!)!
【方法2】搜索+剪枝
首先确定搜索顺序,因为要考虑进位,我们从低位向高位搜索每个字母代表的数。
剪枝1:如果某一位时已有两个数已知,就直接求出未知数。当前位向下一位过渡时,检查加法是否成立,如果不成立就剪枝。(过8个数据)
这个剪枝就可以过大部分的数据,在剪枝1的基础上继续剪枝:
剪枝2:如果某一位已经知道3个数,从上到下设为a,b,c,在不知道进位的情况下,c=(a+b+1) mod n,或(a+b) mod n,如果c不是上述两个值,就剪枝。
剪枝3:如果某一位已知两个数,那么可以求出未知数的两个值(进位1或0),如果这两个值都已取过,就剪枝。
剪枝4:最高位没有进位,所以如果最高位的两个加数已知,且和大于n时,剪枝。
加上这4个剪枝后,过9个测试数据,剩下一个1S多。
针对这个特殊的测试点(第一个未知数特别大),需要从n-1到0枚举每个数字。
代码就不提供了,网上到处都是 : )