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:高斯消元是乙個死胡同,但似乎也有這種方法做出來的,但我太菜了學不會。
改用搜尋剪枝。實際上很多狀態搜了一點點就會發現它是錯的。於是從低位向高位列舉字母,每次列舉後就判斷是否可行,不可行就不再往下搜尋,這樣可以搜過去。
#includeusingnamespace
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。現在,我們...