洛谷P1092 蟲食算(DFS 減枝)

2021-09-23 17:25:11 字數 2208 閱讀 9604

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

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

badc

+cbda

dccc

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

輸入輸出格式

輸入格式:

包含四行。

第一行有乙個正整數n(n≤26)。

後面的三行,每行有乙個由大寫字母組成的字串,分別代表兩個加數以及和。這3個字串左右兩端都沒有空格,從高位到低位,並且恰好有n位。

輸出格式:

一行,即唯一的那組解。

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

輸入樣例#1:

5abced

bdace

ebbaa

輸出樣例#1:

1 0 3 4 2

說明對於30%的資料,保證有n≤10;

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

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

noip2004提高組第4題

思路:從低位到高位,判斷每一組a+b是否等於c,若a已經表示了某個數字,就直接用,若沒有表示則從0到n-1中沒有表示字母的數選擇乙個出來表示a,對b也同理。若字母c已經表示了某個數字,則將表示的數字與(num1+num2+進製)%n的對比,若相等,則進入下一次dfs;若字母c沒有表示數字,則c就表示數字為(num1+num2+進製)%n,進入下一次dfs。直到idx<0表示找到答案。

注意:這道題有兩個技巧:

1.在選擇乙個數字表示字母時,從n-1開始,即逆序開始,可提高找到正確答案的時間

2.需要減枝,具體方法是當dfs到下標idx時,檢查0到idx-1中已經表示數字的字母,若有一列的三個字母均有數字表示,通過判斷(a+b)%n!=c&&(a+b+1)%n!=c進行減枝(減枝必須要,不然有乙個點過不了)

ac**如下:

#include#include#include#includeusing namespace std;

const int maxn = 30;

int vis[maxn]; //初始為-1,不為0表示對應的字母

char ca[maxn];

char cb[maxn];

char cr[maxn];

int ans[maxn]; //表示字母代表的數字 下標為x-『a』,初始值為-1,表示沒有使用

int zm[maxn]; //下標表示0-n-1,值為表示的字母的acsii碼

int n;

void dfs(int idx, int jw)

//fans = 1;

exit(0); //退出程式 標頭檔案是stdlib.h

} return;

} for (int i = idx - 1; i >= 0; i--)

//對第乙個字母進行檢查

if (ans[ca[idx] - 'a'] == -1)

}else

int index = ans[cb[idx] - 'a']; //恢復b的標誌位

ans[cb[idx] - 'a'] = -1;

zm[index] = -1;}}

}else

}else

}ans[ca[idx] - 'a'] = -1; //恢復a的標誌位

zm[i] = -1;

}} }

else

}else

int index = ans[cb[idx] - 'a']; //恢復b的標誌位

ans[cb[idx] - 'a'] = -1;

zm[index] = -1;}}

} else

}else

} }}int main()

洛谷 P1092 蟲食算(dfs)

題目傳送 這題的官方題解是高斯消元,可是本蒟蒻不會。講一下深搜的方法 1.搜尋從第一位的值開始搜,直到最後一位,判斷是否合法。2.注意剪枝防tle。3.三個數都是n位,最高位不能有進製。include include include using namespace std const int max...

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...