p1092
我太弱了,竟然打了乙個上午。。。。。。
一開始我竟然想從a到b列舉每一種排列最後檢查。。。很顯然這種方法效率特別低——o(n!)
於是想到了由低位到高位,由兩個加數上的位到和上的位,逐個列舉數字。當然如果不剪枝的話就和第一種方法沒什麼區別
這個剪枝比較好想,在每列舉完一列時(或者該列上的數字已被列舉了),檢查上兩行(加數字)之和加上上一位的進製對進製數取模是否等於最後一行(兩數之和的位),如果不相等就說明當前狀態無法得出正解,可以剪枝。
這個有點難想到。
眾所周知,加法中進製最多為1(小學數學知識)
那麼對於每一位,如果該位上的三個數都被列舉過了,記第一行數為a,第二行為b,第三行為c,則可以分以下兩種情況討論:
上一位無進製,則a+b==c
上一位有進製,則a+b+1==c
如果對於以上兩種情況均不成立,則說明當前狀態無法得出正解,可以剪枝。
(如果有不理解的可以問我或者結合**注釋理解)
#include#include施工van♂畢!ヾ(゚∀゚ゞ)~~~~~~~#include
#include
using
namespace
std;
int n,ans[30],use[30]=;
char s[4][30
];//
給每乙個編號
int id(char
ch)//
輸出結果
void
print()
void dfs(int x,int y,int
z)
else
if(ans[id(s[y][x])]==-1
) }
}//第三行
if(y==3
) }}}
}else
//第三行
if(y==3
) }}}
} int
main()
洛谷P1092 蟲食算
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...
洛谷P1092 蟲食算
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...
洛谷 P1092 蟲食算
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...