NOIP2004提高組 蟲食算(搜尋剪枝)

2022-05-05 12:24:10 字數 792 閱讀 1488

30pts:善用next_permutation

50pts:先列舉每一位是否有進製,設進製為di=0/1,然後a[i]+b[i]+d[i-1]-10d[i]=c[i],移項後為a[i]+b[i]-c[i]=10d[i]-d[i-1],n位形成n個方程組,可以進行高斯消元,時間複雜度o(2^n*n^3)

100pts:高斯消元是乙個死胡同,但似乎也有這種方法做出來的,但我太菜了學不會。

改用搜尋剪枝。實際上很多狀態搜了一點點就會發現它是錯的。於是從低位向高位列舉字母,每次列舉後就判斷是否可行,不可行就不再往下搜尋,這樣可以搜過去。

#includeusing

namespace

std;

int n,cnt,s[300],used[30],p[30

];char a[30],b[30],c[30

];bool

check()

void

work()

for(int i='

a';i<'

a'+n;i++)printf("

%d "

,s[i]);

exit(0);

}void dfs(int

u)

for(int i=n-1;~i;i--)

if(!used[i])

}s[p[u]+'

a'-1]=-1;}

intmain()

memset(used,

0,sizeof

used);

dfs(1);

}

NOIP2004提高組 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445509678 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題...

搜尋 NOIP2004提高組 四 蟲食算

四 蟲食算 alpha.pas dpr c cpp 問題描述 所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445506978 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第...

NOIP 2004 蟲食算 深搜 剪枝

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445509678其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是 5 和 3,第二行的數字是 5。現在,我們...