NOIP2004提高組 蟲食算

2021-08-07 10:59:33 字數 1905 閱讀 4326

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

43#9865#045

+8468#6633

44445509678

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

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

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

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

badc

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

輸入格式:

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

輸出格式:

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

輸入樣例#1:

5

abced

bdace

ebbaa

輸出樣例#1:

1 0 3 4 2

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

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

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

noip2004提高組第4題

【題解】

首先來一發50分沒有優化的**:

#include#includeconst int maxn=50;

char str1[maxn],str2[maxn],str3[maxn],n;

int sigma[26];

bool done[maxn]=;

int num1[maxn]=,num2[maxn]=,num3[maxn]=;

bool plus()

return true;;

}bool dfs(int dep,int id)

for(int i=0;i

ac:思路是從最後一位開始模擬,從上到下,再從右到左,有個優化就是,每次要從左往右邊遍歷,因為在有得時候,在當前的c的左邊的字元,可能因為後面已經確定了,可以減去

#include#includeconst int maxn=30;

int n;

char s[3][maxn];

bool done[maxn]=;

int sigma[maxn];

bool dfs(int r,int c,int t)

for(int i=0;i=0;i--)if(done[i]==0)

else if(dfs(r+1,c,t))return true;

done[i]=false;

sigma[s[r][c]]=-1;}}

else

else if(dfs(r+1,c,t))return true;;

}return false;

}int main()

{ memset(sigma,-1,sizeof(sigma));

scanf("%d",&n);

scanf("%s%s%s",s[0],s[1],s[2]);

for(int i=0;i

搜尋 NOIP2004提高組 四 蟲食算

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

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 44445506978 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,...