搜尋 蟲食算

2021-07-24 12:30:12 字數 1986 閱讀 1549

p1135

蟲食算(noip)

時間限制 : 

10000 ms   空間限制 : 

65536 kb

問題描述

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。

來看乙個簡單的例子:

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個不同的字母分別代表的數字,使得該加法算式成立。輸入資料保證有且僅有一組解,

輸入格式

包含4行。第一行有乙個正整數n(n<=26),後面的3行每行有乙個由大寫字母組成的字串,分別代表兩個加數以及和。這3個字串左右兩端都沒有空格,從高位到低位,並且恰好有n位。

輸出格式

包含一行。在這一行中,應當包含唯一的那組解。解是這樣表示的:輸出n個數字,分別表示a,b,c……所代表的數字,相鄰的兩個數字用乙個空格隔開,不能有多餘的空格。

樣例輸入

5abced

bdace

ebbaa

樣例輸出

1 0 3 4 2 提示

對於30%的資料,保證有n<=10;

對於50%的資料,保證有n<=15;

對於全部的資料,保證有n<=26。

**  noip2004 高中

經典的搜尋題:

1.搜尋每個字母代表什麼數

2.剪枝1,

按照給出的字串字母從右到左的順序搜尋

,更有效的利用剪枝2

3.剪枝2,

搜乙個字母從算式的右到左,一列中三個字母均已知,模擬運算,這也是為什麼字母的搜尋順序要按(1.)中所說的

4.剪枝3,若一列中三個字母已知兩個,那麼另乙個可以根據這兩個推出來,考慮到這一位是否進製,所以有兩種情況,若兩種情況的數字均被占用,就可以減掉了

#include#include#include#include#includeusing namespace std;

template inline void _read(t& x)

for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';

if(!sign)x=-x;

}int n;

string a,b,c;

int ans[27];

bool used[27];

bool in[27];

int cnt=0;

int order[27];

bool check()

} else break;

} for(i=n-1;i>=0;i--)

else if(x!=-1&&z!=-1)

else if(y!=-1&&z!=-1)

} }return true;

}void dfs(int num) }}

int main()

if(in[b[i]-'a'+1]==false)

if(in[c[i]-'a'+1]==false)

} dfs(1);

}

noip 蟲食算 搜尋

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

蟲食算(搜尋 剪枝)

題意 給乙個3個n進製的有n個字母組成的序列,使第乙個數列和第二個數列加起來等於第三個數列的情況成立。蒟蒻調了一上午 半下午 感覺我碼力極差 考慮乙個剪枝,比如a,b,c的情況,要麼是 a b n c,要麼是 a b 1 n c 考慮了進製 感覺我打麻煩了 其實不太適合參考 include incl...

NOIP2004 蟲食算 搜尋

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