NOIP 2004 蟲食算題解

2022-05-10 06:19:14 字數 2304 閱讀 8233

時間限制: 1 sec  記憶體限制: 128 mb

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

43#98650#45

+ 8468#6633

44445506978

其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。

現在,我們對問題做兩個限制:

首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算式中三個數都有n位,允許有前導的0。

其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的。我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是n進製的,我們就取英文本母表中的前n個大寫字母來表示這個算式中的0到n-1這n個不同的數字(但是這n個字母並不一定順序地代表0到n-1)。輸入資料保證n個字母分別至少出現一次。

badc

+ cbda

dccc

上面的算式是乙個4進製的算式。很顯然,我們只要讓abcd分別代表0123,便可以讓這個式子成立了。你的任務是,對於給定的n進製加法算式,求出n個不同的字母分別代表的數字,使得該加法算式成立。輸入資料保證有且僅有一組解。

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

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

5

abced

bdace

ebbaa

1 0 3 4 2
對於全部的資料,保證有n <= 26。

這道題據說有兩種解法,一種是搜尋,一種是高斯消元,由於本蒟蒻不會高消解法,所以在這裡只說搜尋了。

第一次打就是按照豎式從右往左進行搜尋去列舉該點所代表的數,每列舉完前兩行就去算出和看是否非法,然而t了1個點,1.5秒額……

然後就去乖乖打正解了,挨個列舉每乙個豎式上的位置畢竟還是太多,我們不如去列舉每乙個字母所代表的數字,這樣我們dfs n層就好了,我們每dfs一次就去check一下每一列是否變得合法,以保證每乙個解的正確性,最後直接輸出即可。

下面就說一下check和具體剪枝:

首先我們如果說某一列三位以及進製都知道的話我們可以直接檢查,不合法直接return,如果不知道進製就列舉進幾,反正只有1和0兩種結果,然後傳到下一位,如果說這三位數中有一些數我們並不知道,我們直接表示為不知道進幾位,向下接著搜,且如果搜到最後一位而進製是1我們也需要表示為不合法。

其次,我們應當按照字母從右上到坐下進行列舉,這樣我們就可以保證在check時在位數低的時候基本都有數且更容易找出不合法的解。

而對於每一位數字具體填誰我們可以從大向小列舉,因為本題最高位並無進製,所以最高位是乙個較大的數的可能性較小,可以找到許多不合法的狀態。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define n 50

10using

namespace

std;

11int n,a[n][5

];12

char

b[n];

13int

c[n];

14bool

fw[n],fw2[n];

15int

sx[n],zz;

16bool

check()

1726

else

2735

else

return0;

36}37else

3844

else

if((c[a[l][1]]+c[a[l][2]])%n==c[a[l][3

]])45

49else

return0;

50}51}

52}53return (jw!=1

);54

}55 inline void dfs(int

x)56

63else

6476}77

}78}79

intmain()

8090}91

for(int i=1;i<=n;i++)

92101

}102

}103 dfs(1

);104

return0;

105 }

view code

NOIP2004 蟲食算 搜尋

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

noip2004蟲食算 搜尋

首先這題標算據說是高斯消元,但標籤已經是搜尋了。身為蒟蒻當然只會打搜尋。而我的搜尋又打的很翔,從右到左dfs搜過來,暴枚這一列三個數的情況,然後進製。注意列舉從大到小枚,因為第一位 最左邊 不會進製,所以從右到左時從大到小會更好,不然會被卡tle乙個點。luogu judger enable o2 ...

NOIP2004提高組 蟲食算

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