noip 蟲食算 搜尋

2021-08-09 08:46:10 字數 2328 閱讀 1561

描述

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

43#9865#045

+ 8468#6633

= 44445506678

其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是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……所代表的數字,相鄰的兩個數字用乙個空格隔開,不能有多餘的空格。

5

abced

bdace

ebbaa

copy

1 0 3 4 2
copy

每個測試點1s

noip 2004

很明顯 我們可以想到列舉全排列 來挨個試解是否成立

但是 o(26!) 的複雜度遠遠無法承受

總的來說這還是搜尋 

我們按照計算習慣 從有到左 從上到下 進行列舉

列舉 每個字母可能代表什麼數字

和全排列的思路差不多 但是需要剪枝

這時候剪枝就尤為重要了

剪枝在**中的check函式中

判斷如下

如果當前 a,b,s,都知道了 

判斷是否滿足進製條件

若只有兩的數知道 

知道a,b

如果 c=(a+b)%n,c1=(a+b+1)%n 

兩種情況中的c和c1都用過了 則不成立

知道a,c

如果 b=(c-a+n)%n,b1=(c-a-1+n)%n

b 和 b1都使用過 不成立

知道 b,c 同理

1 #include2 #include3

#define maxn 3045

using

namespace

std;67

char

a[maxn],b[maxn],s[maxn];89

intn,k;

1011

intpos[maxn],rep[maxn];

1213

bool

used[maxn],flag,usednum[maxn];

1415 inline bool

judge()

25if(next>0) return

false;26

return

true;27

}282930 inline bool

check()

40if(rep[ai]!=-1 && rep[bi]!=-1 && rep[si]==-1

) 46

if(rep[ai]!=-1 && rep[bi]==-1 && rep[si]!=-1

) 52

if(rep[ai]==-1 && rep[bi]!=-1 && rep[si]!=-1

) 58}59

return

true;60

}6162 inline void dfs(int

pos)

72return;73

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

83return;84

}8586int

main()

99if(!usednum[bi])

103if(!usednum[si])

107}

108 dfs(0

);109

return0;

110 }

**

搜尋 蟲食算

p1135 蟲食算 noip 時間限制 10000 ms 空間限制 65536 kb 問題描述 所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 43 9865 045 8468 6633 44445506978 其中 號代表被蟲子啃掉的...

NOIP2004 蟲食算 搜尋

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

noip2004蟲食算 搜尋

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