蟲食算(DFS剪枝老噁心的題)

2021-10-19 02:56:49 字數 2011 閱讀 4087

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

來看乙個簡單的例子:

43#9865#045

+8468#6633

----

----

----

--44445506978

其中#號代表被蟲子啃掉的數字。

根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。

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

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

其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。

如果這個算式是n進製的,我們就取英文本母表的前n個大寫字母來表示這個算式中的0到n-1這n個不同的數字:但是這n個字母並不一定順序地代表0到n-1。

輸入資料保證n個字母分別至少出現一次。

badc

dccc

上面的算式是乙個4進製的算式。

很顯然,我們只要讓abcd分別代表0123,便可以讓這個式子成立了。

你的任務是,對於給定的n進製加法算式,求出n個不同的字母分別代表的數字,使得該加法算式成立。

輸入資料保證有且僅有一組解。

輸入格式

輸入包含4行。

第一行有乙個正整數n(n<=26),後面的3行每行有乙個由大寫字母組成的字串,分別代表兩個加數以及和。

這3個字串左右兩端都沒有空格,並且恰好有n位。

輸出格式

輸出包含一行。

在這一行中,應當包含唯一的那組解。

解是這樣表示的:輸出n個數字,分別表示a,b,c……所代表的數字,相鄰的兩個數字用乙個空格隔開,不能有多餘的空格。

輸入樣例:

5abced

bdace

ebbaa

輸出樣例:10

342

#include

using

namespace std;

const

int n=30;

char e[4]

[n];

bool vis[n]

;int path[n]

;//每個字母填什麼

int q[n]

,st[n]

;int n;

bool

check()

else

}else

}return

true;}

bool

dfs(

int u)

return

true;}

for(

int i=

0;ireturn

false;}

intmain()

}}memset

(path,-1

,sizeof path)

;dfs(0

);return0;

}

#include

using

namespace std;

const

int n=30;

char e[4]

[n];

bool vis[n]

;int path[n]

;//每個字母填什麼

int n;

void

dfs(

int x,

int y,

int t)}if

(y==-1

)exit(0

);}int c=e[x]

[y]-

'a';

if(x<2)

}}else

}else

if(path[c]==-

1&&!vis[t%n])}

}int

main()

蟲食算(搜尋 剪枝)

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

Luogu P1092 蟲食算 列舉 剪枝

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

NOIP 2004 蟲食算 深搜 剪枝

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