蟲食算
問題描述
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子:
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個不同的字母分別代表的數字,使得該加法算式成立。輸入資料保證有且僅有一組解
分析
這題直接暴力搜尋肯定會超時,所以在搜尋過程中我們要加點優化:如果當前有一列的數都知道了,那麼判斷一下,如果不合法(1+1=0)就退出。
**
vars1,s2,s3:ansistring;
a:array['a'..'z'] of longint;
b:array[0..26] of char;
f:array[1..26] of boolean;
n,i,j:longint;
function check1:boolean;
vari,g:longint;
begin
check1:=true;
g:=0;
for i:=n downto 1 do
if (a[s1[i]]<>-1) and (a[s2[i]]<>-1) and (a[s3[i]]<>-1) then
if ((a[s1[i]]+a[s2[i]]) mod n<>a[s3[i]]) and ((a[s1[i]]+a[s2[i]]+1) mod n<>a[s3[i]])
then exit(false)
end;
function check2:boolean;
vari,x:longint;
begin
x:=0;
check2:=true;
for i:=n downto 1 do
begin
x:=x+a[s1[i]]+a[s2[i]];
if x mod n<>a[s3[i]] then exit(false);
x:=x div n;
end;
end;
procedure print;
vari:char;
begin
for i:='a' to chr(64+n) do
write(a[i],' ');
halt;
end;
procedure dfs(dep:longint);
vari:longint;
begin
if not check1 then exit;
if dep>n then if check2 then print;
for i:=n-1 downto 0 do
if not f[i] then
begin
f[i]:=true;
a[b[dep]]:=i;
dfs(dep+1);
f[i]:=false;
a[b[dep]]:=-1;
end;
end;
begin
readln(n);
readln(s1);
readln(s2);
readln(s3);
for i:=n downto 1 do
begin
if a[s1[i]]<>-1 then
begin
inc(j);
b[j]:=s1[i];
a[s1[i]]:=-1;
end;
if a[s2[i]]<>-1 then
begin
inc(j);
b[j]:=s2[i];
a[s2[i]]:=-1;
end;
if a[s3[i]]<>-1 then
begin
inc(j);
b[j]:=s3[i];
a[s3[i]]:=-1;
end;
end;
dfs(1);
end.
子矩陣(NOIP2014 普及組第四題)
給出如下定義 子矩陣 從乙個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣 保持行與 列的相對順序 被稱為原矩陣的乙個子矩陣。例如,下面左圖中選取第 2 4 行和第 2 4 5 列交叉位置的元素得到乙個 2 3 的子矩陣如右圖所示。相鄰的元素 矩陣中的某個元素與其上下左右四個元素 如果存在的話 是...
NOIP2014提高組模擬題 8 9
一 最大配對 題意 給兩個序列,要求選k組,每組從兩個序列中各選乙個數,要使各組數的差的和最大。小論 兩個序列分別排序。每次用乙個序列的最大的減另乙個序列的最小的。當時情況 估計100分,結果50分。雖然題目有提醒答案可能超過2 31 1,我也看到了,但想著等下打完再改,於是我打著打著就忘了 最後掛...
noip2014 提高組題解 equation
題目大意 給定高次方程an x n a1 x 1 a0 0 求 1,m 區間內有多少個整數根 ai 10 10000,m 1000000,n 100 首先,在考試的時候由於我很弱,一看到ai的範圍我就傻了,果斷30分騙起 解題思路 1.30分 30分很好騙,直接暴力就行了 2.60分 因為我考試的時...