題解 洛谷P1092 蟲食算

2022-05-24 09:15:10 字數 1174 閱讀 7998

p1092

我太弱了,竟然打了乙個上午。。。。。。

一開始我竟然想從a到b列舉每一種排列最後檢查。。。很顯然這種方法效率特別低——o(n!)

於是想到了由低位到高位,由兩個加數上的位到和上的位,逐個列舉數字。當然如果不剪枝的話就和第一種方法沒什麼區別

這個剪枝比較好想,在每列舉完一列時(或者該列上的數字已被列舉了),檢查上兩行(加數字)之和加上上一位的進製對進製數取模是否等於最後一行(兩數之和的位),如果不相等就說明當前狀態無法得出正解,可以剪枝。

這個有點難想到。

眾所周知,加法中進製最多為1(小學數學知識)

那麼對於每一位,如果該位上的三個數都被列舉過了,記第一行數為a,第二行為b,第三行為c,則可以分以下兩種情況討論:

上一位無進製,則a+b==c

上一位有進製,則a+b+1==c

如果對於以上兩種情況均不成立,則說明當前狀態無法得出正解,可以剪枝。

(如果有不理解的可以問我或者結合**注釋理解)

#include#include

#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()

施工van♂畢!ヾ(゚∀゚ゞ)~~~~~~~

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...

洛谷 P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...