洛谷——P1092 虫食算
題目描述
所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看一個簡單的例子:
43#9865#045 + 8468#663344445509678其中$#$號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是55和33,第二行的數字是55。
現在,我們對問題做兩個限制:
首先,我們只考慮加法的蟲食算。這里的加法是NN進制加法,算式中三個數都有NN位,允許有前導的00。
其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是NN進制的,我們就取英文字母表午的前NN個大寫字母來表示這個算式中的00到N-1N?1這NN個不同的數字:但是這NN個字母并不一定順序地代表00到N-1N?1。輸入數據保證NN個字母分別至少出現一次。
BADC +CBDADCCC上面的算式是一個4進制的算式。很顯然,我們只要讓ABCDABCD分別代表01230123,便可以讓這個式子成立了。你的任務是,對于給定的NN進制加法算式,求出NN個不同的字母分別代表的數字,使得該加法算式成立。輸入數據保證有且僅有一組解。
輸入輸出格式
輸入格式:
?
包含四行。
第一行有一個正整數N(N \le 26)N(N≤26)。
后面的三行,每行有一個由大寫字母組成的字符串,分別代表兩個加數以及和。這3個字符串左右兩端都沒有空格,從高位到低位,并且恰好有NN位。
?
輸出格式:
?
一行,即唯一的那組解。
解是這樣表示的:輸出NN個數字,分別表示A,B,C,…A,B,C,…所代表的數字,相鄰的兩個數字用一個空格隔開,不能有多余的空格。
?
輸入輸出樣例
輸入樣例#1:?復制
5 ABCED BDACE EBBAA輸出樣例#1:?復制
1 0 3 4 2說明
對于30%的數據,保證有N \le 10N≤10;
對于50%的數據,保證有N \le 15N≤15;
對于全部的數據,保證有N \le 26N≤26。
noip2004提高組第4題
?
只AC了第一個點 其他點運行超時
但是還是想紀念一下 用搜索能解出來了...
感動...
#include <iostream> #include <string> #include <map> using namespace std;int n, p[27]; bool vis[27] = {false}; string add1, add2, sum; map<char, int> mm;void generateP(int index) {if(index == n+1){for(int i = 1; i <= n; i++){mm['A'- 1 + i] = p[i];}int jinwei = 0;bool flag = true;for(int i = add1.size()-1; i >= 0; i--){int a1 = mm[add1[i]], a2 = mm[add2[i]], s1 = mm[sum[i]];int sum1 = a1 + a2 + jinwei;if (sum1 % 5 == s1){if (sum1 / 5 != 0) //有進位{jinwei = sum1 / 5;}}else{flag = false;break;}}if (flag){for (int i = 1; i <= n; i++){printf("%d ", p[i]);}}else return;}for(int i = 0; i < n; i++){if(vis[i] == false){p[index] = i;vis[i] = true;generateP(index+1);vis[i] = false;}} }int main() {scanf("%d", &n);cin >> add1 >> add2 >> sum;generateP(1);return 0; }?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的洛谷——P1092 虫食算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷——P1605 迷宫
- 下一篇: 洛谷——P1019 单词接龙