NOIP2004 蟲食算 搜尋

2021-06-28 07:25:17 字數 1572 閱讀 4013

【問題描述】

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

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

【輸入檔案】

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

【輸出檔案】

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

解題思路:搜尋的方法還是很明顯的。。主要問題在搜尋順序和剪枝上了。由於是加法有進製,所以從低位向高位搜。剪枝有以下幾點:1.若一列的兩個數已知,但是第三個數與這兩個數推出的結果矛盾;2.每搜出乙個字母都向更高位搜尋,如果出現像1一樣的矛盾就剪枝。。還有一些想不起了。。另外對於每乙個字母從大往小蒐會比從小往下搜快,,,【noip資料的特點?】

**(死活有乙個點過不去):

#include

#include

#include

#include

#include

using namespace std;

intn,a[30],b[30],c[30],u[30]=,un[30]=,f[30],q[30],i,sum,j;

string s1,s2,s3;

int pan()

if (d%n!=f[c[i]]) return -1;

d=d/n;

}return 1;

}void dfs(int k)

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

if (un[i]==0)

}int main()

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

if (u[b[i]]==0)

if (u[c[i]]==0)

}memset(u,0,sizeof(u));//printf("*");

dfs(1);

}

noip2004蟲食算 搜尋

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

NOIP2004提高組 蟲食算

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

搜尋 NOIP2004提高組 四 蟲食算

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