四、蟲食算
(alpha.pas/dpr/c/cpp)
【問題描述】
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子:
43#9865#045
+ 8468#6633
44445506978
其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。
現在,我們對問題做兩個限制:
首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算式中三個數都有n位,允許有前導的0。
其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是n進製的,我們就取英文本母表午的前n個大寫字母來表示這個算式中的0到n-1這n個不同的數字:但是這n個字母並不一定順序地代表0到n-1)。輸入資料保證n個字母分別至少出現一次。
badc
+ crda
dccc
上面的算式是乙個4進製的算式。很顯然,我們只要讓abcd分別代表0123,便可以讓這個式子成立了。你的任務是,對於給定的n進製加法算式,求出n個不同的字母分別代表的數字,使得該加法算式成立。輸入資料保證有且僅有一組解,
【輸入檔案】
輸入檔案alpha.in包含4行。第一行有乙個正整數n(n<=26),後面的3行每行有乙個由大寫字母組成的字串,分別代表兩個加數以及和。這3個字串左右兩端都沒有空格,從高位到低位,並且恰好有n位。
【輸出檔案】
輸出檔案alpha.out包含一行。在這一行中,應當包含唯一的那組解。解是這樣表示的:輸出n個數字,分別表示a,b,c……所代表的數字,相鄰的兩個數字用乙個空格隔開,不能有多餘的空格。
【樣例輸入】
5abced
bdace
ebbaa
【樣例輸出】
1 0 3 4 2
【資料規模】
對於30%的資料,保證有n
對於50%的資料,保證有n
對於全部的資料,保證有n
樸素方法是進行一次全排列,然後一次判斷,能得40分
加上可行性剪枝然後進行一次預處理,預計能得70分
標程見然後接下來有一種投機取巧的方法就是全排列的時候倒序列舉就能得100分ac
pascal code(投機取巧 倒序列舉)
program alpha;
var n:longint;
s:array[1..3] of string;
a,b,c,ans,h,order:array[0..30] of longint;
procedure init;
begin
assign(input,'alpha.in');
assign(output,'alpha.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;
procedure pre;
var i,k:longint;
u:array[0..30] of longint;
begin
fillchar(u,sizeof(u),0);
k:=0;
for i:=n downto 1 do
begin
if u[a[i]]=0 then
begin
u[a[i]]:=1;
k:=k+1;
order[k]:=a[i];
end;
if u[b[i]]=0 then
begin
u[b[i]]:=1;
k:=k+1;
order[k]:=b[i];
end;
if u[c[i]]=0 then
begin
u[c[i]]:=1;
k:=k+1;
order[k]:=c[i];
end;
end;
end;
procedure readdata;
var i:longint;
begin
readln(n);
for i:=1 to 3 do
readln(s[i]);
//預處理 a+b=c
NOIP2004提高組 蟲食算(搜尋剪枝)
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 高...
NOIP2004提高組 蟲食算
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445509678 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題...
NOIP2004 蟲食算 搜尋
問題描述 所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445506978 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,...